Partager via


Self-Registration

À mesure que le logiciel de composant continue de croître en tant que marché, il y aura de plus en plus d’instances où un utilisateur obtient un nouveau composant logiciel en tant que module DLL ou EXE unique, par exemple lors du téléchargement d’un nouveau composant à partir d’un service en ligne ou de réception d’un ami sur un disque de floppy. 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 long. Outre les problèmes de licence, 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’inscription automatique est le moyen standard par lequel un module 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 via IClassFactory2, un serveur peut devenir un module entièrement autonome sans avoir besoin de programmes d’installation externes ou de fichiers .reg.

Tout module auto-inscrit, DLL ou EXE, doit 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 la DLL ou EXE en premier.

Si le serveur est empaqueté dans un module DLL, la DLL doit exporter les fonctions DllRegisterServer et DllUnregisterServer. Toute application qui souhaite indiquer au serveur de s’inscrire (autrement dit, tous ses ID de bibliothèque de types et CLSID) peut obtenir un pointeur vers DllRegisterServer via la fonctionGetProcAddress. Dans dllRegisterServer, la DLL crée toutes ses entrées de Registre nécessaires, stockant le chemin d’accès correct à la DLL pour toutes les entrées InprocServer32 ou InprocHandler32.

Lorsqu’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 aveuglement 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 EXE lance le serveur EXE avec l’argument de ligne de commande /RegServer ou -RegServer (sans respect de la casse). Si l’application souhaite annuler l’inscription du serveur, elle lance l’exe avec l’argument de ligne de commande /UnregServer ou -UnregServer. L’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 de module sous LocalServer32 au lieu de InprocServer32 ou InprocHandler32.

Le serveur doit inscrire le chemin d’accès complet à l’emplacement d’installation du module DLL ou EXE pour leur InprocServer32, InprocHandler32et Clés LocalServer32 dans le Registre. Le chemin du module est facilement obtenu via la fonction GetModuleFileName.

installation en tant qu’application de service

Inscrire une classe lors de l’installation

Inscrire un EXE Server en cours d’exécution

Inscrire des objets dans le ROT