¿Cómo saber si se ha registrado una DLL?

El registro de dlls (a través de regsvr32) no es algo declarativo, es procedural. Una dll no ofrece información sobre las cosas que tienen que ocurrir cuando se instala. Una dll simplemente proporciona dos funciones para que regsvr32 pueda llamar, una para registrarla (DllRegisterServer) y otra para desregistrarla (DllUnregisterServer).

El cómo funcionan estas funciones realizan no está especificado. La mayoría de las veces, estas funciones tan sólo escriben algunas cosas en el registro, pero DllRegisterServer no se limita sólo a eso. Por ejemplo, la función DllRegisterServer puede escribir algunos registros sólo condicionalmente, sólo si el usuario está ejectuando una versión específica de Windows. O puede que haga una copia de seguridad antes de sobreescribirlo. Puede crear o modificar archivos como parte del proceso de instalación o configurar las reglas del firewall o buscar y desinstalar versiones anteriores de esa misma dll.

Por convenio, la función DllRegisterServer hace las operaciones necesarias para el registro de una dll, y la función DllUnregisterServer deshace lo que hizo la primera, pero como esas funciones son de la dll, no hay garantías de que sea eso lo que ocurre en realidad. ¿Quién sabe?, puede que DllRegisterServer formatee el disco duro. Una función DllRegisterServer puede devolver directamente S_OK sin hacer nada. ¿Cómo podemos asegurar que una función no tiene efectos cuando es llamada?

Dado que el registro de dlls puede realizar operaciones arbitrarias, tenemos que conocer el dominio de la dll concreta. Si sabemos que una dll registra un objeto COM con un CLSID concreto, podemos comprobar si ese CLSID ya está registrado.

Espero que os sirva.

Juan María Laó Ramos.

Artículo original