Self-Registration
À mesure que les logiciels de composant continuent de croître en tant que marché, il y aura de plus en plus de cas où un utilisateur obtient un nouveau composant logiciel sous la forme d’une DLL ou d’un module EXE unique, par exemple lors du téléchargement d’un nouveau composant à partir d’un service en ligne ou de la réception d’un composant d’un ami sur une disquette. Dans ce cas, il n’est pas pratique d’exiger de l’utilisateur qu’il suive une longue procédure d’installation ou un programme d’installation. 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’auto-inscription 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 les licences gérées 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 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 qui souhaite indiquer au serveur de s’inscrire elle-même (c’est-à-dire tous ses CLSID et ses ID de bibliothèque de types) peut obtenir un pointeur vers DllRegisterServer via la fonction GetProcAddress . Dans DllRegisterServer, la DLL crée toutes ses entrées de Registre nécessaires, en stockant le chemin d’accès approprié à 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 aveuglément 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 qui souhaite inscrire le serveur lance le serveur EXE avec l’argument de ligne de commande /RegServer ou -RegServer (ne respectant pas 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 leurs clés InprocServer32, InprocHandler32 et LocalServer32 respectives dans le Registre. Le chemin du module est facilement obtenu via la fonction GetModuleFileName .
Rubriques connexes