Self-Registration
Naarmate onderdeelsoftware als een markt blijft groeien, zullen er steeds meer exemplaren zijn waarbij een gebruiker een nieuw softwareonderdeel verkrijgt als één DLL- of EXE-module, zoals bij het downloaden van een nieuw onderdeel van een on-line service of het ontvangen van een vriend op een diskette. In deze gevallen is het niet praktisch om te vereisen dat de gebruiker een lange installatieprocedure of een installatieprogramma doorloopt. Naast de licentieproblemen, die worden verwerkt via IClassFactory2, maakt een installatieprocedure doorgaans de benodigde registervermeldingen voor een onderdeel om correct te worden uitgevoerd in de COM- en OLE-context.
Zelfregistratie is de standaardmethode waarmee een servermodule eigen registerbewerkingen, zowel registratie als niet-registratie, in de module zelf kan verpakken. Wanneer een server wordt gebruikt met licenties die worden verwerkt via IClassFactory2, kan een server een volledig zelfstandige module worden zonder dat externe installatieprogramma's of .reg bestanden nodig zijn.
Elke module, DLL of EXE die zichzelf registreert, moet eerst een OleSelfRegister-tekenreeks bevatten in de StringFileInfo sectie van de resource voor versiegegevens, zoals hier wordt weergegeven.
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
Met het bestaan van deze gegevens kan elke belanghebbende, zoals een toepassing die dit nieuwe onderdeel wil integreren, bepalen of de server zelfregistratie ondersteunt zonder eerst de DLL of EXE te hoeven laden.
Als de server is verpakt in een DLL-module, moet het DLL-bestand de functies exporteren DllRegisterServer en DllUnregisterServer. Elke toepassing die de server opdracht wil geven zichzelf te registreren (dat wil gezegd, alle CLSID's en type bibliotheek-id's) kan een aanwijzer verkrijgen voor DllRegisterServer via de functie GetProcAddress. Binnen DllRegisterServermaakt de DLL alle benodigde registervermeldingen, waarbij het juiste pad naar het DLL-bestand wordt opgeslagen voor alle InprocServer32 of InprocHandler32 vermeldingen.
Wanneer een toepassing het onderdeel van het systeem wil verwijderen, moet het de registratie van dat onderdeel ongedaan maken door DllUnregisterServeraan te roepen. Binnen deze aanroep verwijdert de server exact de vermeldingen die deze eerder hebt gemaakt in DllRegisterServer. De server mag niet blind alle vermeldingen voor de klassen verwijderen, omdat andere software mogelijk extra vermeldingen heeft opgeslagen, zoals een TreatAs-sleutel.
Als de server is verpakt in een EXE-module, start de toepassing die de server wil registreren de EXE-server met het opdrachtregelargument /RegServer of -RegServer (hoofdlettergevoelig). Als de toepassing de registratie van de server ongedaan wil maken, wordt de EXE gestart met het opdrachtregelargument /UnregServer of -UnregServer. De zelfregistratie-EXE detecteert deze opdrachtregelargumenten en roept dezelfde bewerkingen aan als een DLL-bestand binnen DllRegisterServeren DllUnregisterServer, respectievelijk het modulepad registreren onder LocalServer32 in plaats van InprocServer32 of InprocHandler32.
De server moet het volledige pad registreren naar de installatielocatie van de DLL- of EXE-module voor de respectieve InprocServer32, InprocHandler32en LocalServer32 sleutels in het register. Het modulepad is eenvoudig te verkrijgen via de functie GetModuleFileName.
Verwante onderwerpen