Self-Registration
A medida que el software de componentes sigue creciendo como un mercado, habrá más instancias en las que un usuario obtiene un nuevo componente de software como un único módulo DLL o EXE, como al descargar un nuevo componente desde un servicio en línea o recibir uno de un amigo en un disco de disquete. En estos casos, no es práctico exigir al usuario que pase por un largo procedimiento de instalación o programa de instalación. Además de los problemas de licencia, que se controlan a través de IClassFactory2, un procedimiento de instalación normalmente crea las entradas del Registro necesarias para que un componente se ejecute correctamente en el contexto COM y OLE.
El registro automático es el medio estándar a través del cual un módulo de servidor puede empaquetar sus propias operaciones del Registro, tanto de registro como de anulación del registro, en el propio módulo. Cuando se usa con licencias administradas a través de IClassFactory2, un servidor puede convertirse en un módulo completamente independiente sin necesidad de programas de instalación externos ni archivos .reg.
Cualquier módulo de registro automático, DLL o EXE, primero debe incluir una cadena "OleSelfRegister" en la sección StringFileInfo del recurso de información de versión, como se muestra aquí.
VS_VERSION_INFO VERSIONINFO
...
BEGIN
BLOCK "StringFileInfo"
BEGIN
#ifdef UNICODE
BLOCK "040904B0" // Lang=US English, CharSet=Unicode
#else
BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual
#endif
BEGIN
...
VALUE "OLESelfRegister", "\0"
END
...
END
...
END
La existencia de estos datos permite a cualquier parte interesada, como una aplicación que desee integrar este nuevo componente, para determinar si el servidor admite el autoregistro sin tener que cargar primero el archivo DLL o EXE.
Si el servidor se empaqueta en un módulo DLL, el archivo DLL debe exportar las funciones DllRegisterServer y DllUnregisterServer. Cualquier aplicación que desee indicar al servidor que se registre a sí mismo (es decir, todos sus CLSID y identificadores de biblioteca de tipos) pueden obtener un puntero a DllRegisterServer a través de la función GetProcAddress . En DllRegisterServer, el archivo DLL crea todas sus entradas del Registro necesarias, almacenando la ruta de acceso correcta al archivo DLL para todas las entradas InprocServer32 o InprocHandler32 .
Cuando una aplicación desea quitar el componente del sistema, debe anular el registro de ese componente mediante una llamada a DllUnregisterServer. Dentro de esta llamada, el servidor quita exactamente esas entradas que creó anteriormente en DllRegisterServer. El servidor no debe quitar ciegamente todas las entradas de sus clases porque es posible que otro software haya almacenado entradas adicionales, como una clave TreatAs .
Si el servidor está empaquetado en un módulo EXE, la aplicación que desea registrar el servidor inicia el servidor EXE con el argumento de línea de comandos /RegServer o -RegServer (sin distinción entre mayúsculas y minúsculas). Si la aplicación desea anular el registro del servidor, inicia exe con el argumento de línea de comandos /UnregServer o -UnregServer. El EXE de registro automático detecta estos argumentos de línea de comandos e invoca las mismas operaciones que un archivo DLL en DllRegisterServery DllUnregisterServer, respectivamente, registrando su ruta de acceso de módulo en LocalServer32 en lugar de InprocServer32 o InprocHandler32.
El servidor debe registrar la ruta de acceso completa a la ubicación de instalación del módulo DLL o EXE para sus respectivas claves InprocServer32, InprocHandler32 y LocalServer32 en el Registro. La ruta de acceso del módulo se obtiene fácilmente a través de la función GetModuleFileName .
Temas relacionados