Self-Registration
Da Komponentensoftware als Markt weiter wächst, wird es immer mehr Fälle geben, in denen ein Benutzer eine neue Softwarekomponente als einzelnes DLL- oder EXE-Modul erhält, z. B. beim Herunterladen einer neuen Komponente von einem Onlinedienst oder beim Empfangen einer komponente von einem Freund auf einer Diskette. In diesen Fällen ist es nicht praktikabel, vom Benutzer zu verlangen, dass er einen langen Installationsvorgang oder ein Setupprogramm durchläuft. Neben den Lizenzierungsproblemen, die über IClassFactory2 behandelt werden, erstellt ein Installationsverfahren in der Regel die erforderlichen Registrierungseinträge, damit eine Komponente im COM- und OLE-Kontext ordnungsgemäß ausgeführt werden kann.
Die Selbstregistrierung ist die Standardmethode, mit der ein Servermodul seine eigenen Registrierungsvorgänge , sowohl die Registrierung als auch die Aufhebung der Registrierung, in das Modul selbst packen kann. Bei Verwendung mit der Lizenzierung, die über IClassFactory2 verarbeitet wird, kann ein Server zu einem vollständig eigenständigen Modul werden, ohne dass externe Installationsprogramme oder REG-Dateien erforderlich sind.
Jedes selbst registrierende Modul, DLL oder EXE, sollte zuerst eine "OleSelfRegister"-Zeichenfolge im Abschnitt StringFileInfo seiner Versionsinformationsressource enthalten, wie hier gezeigt.
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
Das Vorhandensein dieser Daten ermöglicht es jeder interessierten Partei, z. B. einer Anwendung, die diese neue Komponente integrieren möchte, zu bestimmen, ob der Server die Selbstregistrierung unterstützt, ohne zuerst die DLL oder EXE laden zu müssen.
Wenn der Server in einem DLL-Modul verpackt ist, muss die DLL die Funktionen DllRegisterServer und DllUnregisterServer exportieren. Jede Anwendung, die den Server anweisen möchte, sich selbst zu registrieren (d. h. alle CLSIDs und Typbibliotheks-IDs), kann über die GetProcAddress-Funktion einen Zeiger auf DllRegisterServer abrufen. Innerhalb von DllRegisterServer erstellt die DLL alle erforderlichen Registrierungseinträge und speichert den richtigen Pfad zur DLL für alle InprocServer32 - oder InprocHandler32-Einträge .
Wenn eine Anwendung die Komponente aus dem System entfernen möchte, sollte sie die Registrierung dieser Komponente durch Aufrufen von DllUnregisterServer aufheben. Innerhalb dieses Aufrufs entfernt der Server genau die Einträge, die er zuvor in DllRegisterServer erstellt hat. Der Server sollte nicht blind alle Einträge für seine Klassen entfernen, da andere Software möglicherweise zusätzliche Einträge wie einen TreatAs-Schlüssel gespeichert hat.
Wenn der Server in ein EXE-Modul gepackt ist, startet die Anwendung, die den Server registrieren möchte, den EXE-Server mit dem Befehlszeilenargument /RegServer oder -RegServer (ohne Beachtung der Groß-/Kleinschreibung). Wenn die Anwendung die Registrierung des Servers aufheben möchte, startet sie exe mit dem Befehlszeilenargument /UnregServer oder -UnregServer. Die selbst registrierende EXE erkennt diese Befehlszeilenargumente und ruft die gleichen Vorgänge auf, die eine DLL innerhalb von DllRegisterServerbzw . DllUnregisterServer ausführen würde, wobei der Modulpfad unter LocalServer32 anstelle von InprocServer32 oder InprocHandler32 registriert wird.
Der Server muss den vollständigen Pfad zum Installationsspeicherort der DLL oder des EXE-Moduls für die jeweiligen Schlüssel InprocServer32, InprocHandler32 und LocalServer32 in der Registrierung registrieren. Der Modulpfad kann problemlos über die GetModuleFileName-Funktion abgerufen werden.
Zugehörige Themen