Self-Registration

Étant donné que le logiciel de composant continue de croître sur le marché, il y aura de plus en plus d’instances où un utilisateur obtient un nouveau composant logiciel sous la forme d’un module DLL ou EXE unique, par exemple lors du téléchargement d’un nouveau composant à partir d’un service en ligne ou en recevant un à partir d’un ami sur une disquette. Dans ce cas, il n’est pas pratique de demander à l’utilisateur de passer par une procédure d’installation ou un programme d’installation de longue durée. Outre les problèmes de gestion de licences, qui sont gérés via IClassFactory2, une procédure d’installation crée généralement les entrées de Registre nécessaires pour qu’un composant s’exécute correctement dans le contexte com et OLE.

L’auto-inscription est le moyen standard par lequel un module de serveur peut empaqueter ses propres opérations de Registre, à la fois l’inscription et la désinscription, dans le module lui-même. Lorsqu’il est utilisé avec la gestion des licences par le biais de IClassFactory2, un serveur peut devenir un module entièrement autonome sans avoir besoin de programmes d’installation externes ou de fichiers. reg.

Tout module à inscription automatique, DLL ou EXE, doit tout d’abord inclure une chaîne « OleSelfRegister » dans la section StringFileInfo de sa ressource d’informations de version, comme illustré ici.

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 
 

L’existence de ces données permet à toute partie intéressée, telle qu’une application qui souhaite intégrer ce nouveau composant, de déterminer si le serveur prend en charge l’inscription automatique sans avoir à charger d’abord la DLL ou l’EXE.

Si le serveur est empaqueté dans un module DLL, la DLL doit exporter les fonctions DllRegisterServer et DllUnregisterServer. Toute application souhaitant demander au serveur de s’inscrire lui-même (autrement dit, tous ses CLSID et ID de bibliothèque de types) peut obtenir un pointeur vers DllRegisterServer via la fonction GetProcAddress . Dans DllRegisterServer, la dll crée toutes les entrées de Registre nécessaires, en stockant le chemin d’accès correct à la dll pour toutes les entrées InprocServer32 ou InprocHandler32 .

Quand une application souhaite supprimer le composant du système, elle doit annuler l’inscription de ce composant en appelant DllUnregisterServer. Dans cet appel, le serveur supprime exactement les entrées qu’il a créées précédemment dans DllRegisterServer. Le serveur ne doit pas supprimer en aveugle toutes les entrées de ses classes, car d’autres logiciels peuvent avoir stocké des entrées supplémentaires, telles qu’une clé TreatAs .

Si le serveur est empaqueté dans un module EXE, l’application souhaitant inscrire le serveur lance le serveur EXE avec l’argument de ligne de commande /regserver ou -regserver (non-respect de la casse). Si l’application souhaite annuler l’inscription du serveur, elle lance l’EXE avec l’argument de ligne de commande commutateur/unregserver ou -UnregServer. Le fichier EXE auto-inscrit détecte ces arguments de ligne de commande et appelle les mêmes opérations qu’une DLL dans DllRegisterServeret DllUnregisterServer, respectivement, en inscrivant son chemin d’accès au module sous LocalServer32 au lieu de InprocServer32 ou InprocHandler32.

Le serveur doit enregistrer le chemin d’accès complet de l’emplacement d’installation du module DLL ou EXE pour leurs clés InprocServer32, InprocHandler32 et LocalServer32 respectives dans le registre. Le chemin d’accès du module est facilement obtenu via la fonction GetModuleFileName .

Installation d’une application en tant que service

Inscription d’une classe lors de l’installation

Inscription d’un serveur exécutable en cours d’exécution

Inscription d’objets dans le ROT