Compartir vía


Self-Registration

A medida que el software de componentes sigue creciendo como 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 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 el registro como la anulación del registro, en el propio módulo. Cuando se usa con licencias controladas 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, debe incluir primero una cadena "OleSelfRegister" en la sección StringFileInfo de su 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 registro propio sin tener que cargar primero el archivo DLL o EXE.

Si el servidor está empaquetado 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 (es decir, todos sus CLSID y identificadores de biblioteca de tipos) puede 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 todos los InprocServer32 o InprocHandler32 entradas.

Cuando una aplicación desea quitar el componente del sistema, debe anular el registro de ese componente llamando 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 otro software puede haber 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 de InprocServer32, InprocHandler32y LocalServer32 claves en el Registro. La ruta de acceso del módulo se obtiene fácilmente a través de la funciónGetModuleFileName.

instalar como una aplicación de servicio

registrar una clase en el de instalación

registrar un servidor EXE en ejecución

registrar objetos en el ROT