Holy cow, I wrote a book!
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
Instead, the DLL merely provides two functions
for regsvr32 to call, one for registration
and another for unregistration
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.
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.