A customer pointed out that you can use regsvr32
to register a DLL or to unregister it, but how do you query whether a DLL has been registered?
DLL registration (via regsvr32
) is not declarative; it is procedural. A DLL does not provide a manifest of things it would like to happen when installed. Instead, the DLL merely provides two functions for regsvr32
to call, one for registration (DllRegisterServer
) and another for unregistration (DllUnregisterServer
). All the regsvr32
function does is call those functions.
How those functions perform their registration and unregistration is not specified. Most of the time, those functions merely write some registry settings, but the DllRegisterServer
is not limited to that. For example, the DllRegisterServer
function might write some values only conditionally, say, only if the user is running a specific version of Windows. Or it might back up the old value of a registry key before it overwrites it. It might create or modify files as part of its installation or configure your firewall settings or look for and uninstall previous versions of the same DLL.
By convention, the DllRegisterServer
performs whatever operations are necessary for DLL registration, and the DllUnregisterServer
reverses those operations, but since those functions are provided by the DLL, there’s no guarantee that that’s what actually happens. Who knows, maybe DllRegisterServer
formats your hard drive. A DllRegisterServer
function might just return S_OK
without doing anything. How can you tell whether a function with no side effects has been called?
Given that DLL registration can encompass arbitrary operations, there is no general-purpose way of determining whether registration has taken place for an arbitrary DLL.
To determine whether a DLL has been registered, you need to bring in domain-specific knowledge. If you know that a DLL registers a COM object with a particular CLSID, you can check whether that CLSID is indeed registered.
0 comments