> What happens if I try to open the same IVI driver for the same instrument twice without closing it first?
No problem happens at all. Every IVI instrument driver is designed as "thread-safe" as specified so in the IVI specs. If your app opens 2 instances of instrument session using the same IVI driver and connecting to the same VISA address at a time, they will have different sessions (meant different IVI handles assigned) and both sessions will be active at the same time. However, when accessing the instrument from multiple threads at the same time, some lock/unlock mechanism will be needed. The locking method can be Win32 critical-section, semaphoe, mutex, or can be IVI driver's <prefix>_LockSession() function. The <prefix>_LockSession()/UnlockSession() functions are normally wrapper functions that invoke VISA viLock()/viUnlock() inside.
As for driver DLL virtualization, the driver module that your app will use can be automatically switched by using IVI class driver (such as IviDCPwr class driver for power supply) and with IVI Configuration Server settings including LogicalName/DriverSession/SoftwareModule/HardwareAsset etc... However it requires all the IVI drivers your app will use must be compliant with the same instrument class.
As for channel name virtualization, PhyisicalName and VirtualName capability of IVI Configuration Server supports it. If the IVI driver "A" supports the instrument trace channels as "Channel1".."Channel4", and the other driver "B" supports "Trace1".."Trace4" names, you can't embed these hard-coded channel names in the app to avoid driver-specific dependency. Instead, you can configure your own channel names such as "MyTrack1".."MyTrack4" mapping to appopriate channel names as your need, you can virtualize these name in your app. This virtualization can be managed in NI-MAX, once you have installed NI IVI Compliance Package 2.x.