Self-Registration
Allt eftersom komponentprogramvaran fortsätter att växa som en marknad kommer det att finnas fler och fler instanser där en användare får en ny programvarukomponent som en enda DLL- eller EXE-modul, till exempel när en ny komponent laddas ned från en onlinetjänst eller tar emot en från en vän på en diskett. I dessa fall är det inte praktiskt att kräva att användaren genomgår en lång installationsprocedur eller ett installationsprogram. Förutom licensproblemen, som hanteras via IClassFactory2, skapar en installationsprocedur vanligtvis de registerposter som krävs för att en komponent ska kunna köras korrekt i COM- och OLE-kontexten.
Självregistrering är det standardsätt genom vilket en servermodul kan paketera sina egna registeråtgärder, både registrering och avregistrering, i själva modulen. När den används med licensiering som hanteras via IClassFactory2kan en server bli en helt fristående modul utan behov av externa installationsprogram eller .reg filer.
Alla självregistreringsmoduler, DLL eller EXE, bör först innehålla en "OleSelfRegister"-sträng i avsnittet StringFileInfo i dess versionsinformationsresurs, som du ser här.
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
Förekomsten av dessa data gör det möjligt för alla berörda parter, till exempel ett program som vill integrera den nya komponenten, att avgöra om servern stöder självregistrering utan att behöva läsa in DLL eller EXE först.
Om servern är paketerad i en DLL-modul måste DLL-filen exportera funktionerna DllRegisterServer och DllUnregisterServer. Alla program som vill instruera servern att registrera sig (det vill säga alla dess CLSID:er och typbiblioteks-ID: er) kan hämta en pekare för att DllRegisterServer via funktionen GetProcAddress. I DllRegisterServerskapar DLL:en alla nödvändiga registerposter och lagrar rätt sökväg till DLL:en för alla InprocServer32- eller InprocHandler32 poster.
När ett program vill ta bort komponenten från systemet bör den avregistrera komponenten genom att anropa DllUnregisterServer. I det här anropet tar servern bort exakt de poster som den tidigare skapade i DllRegisterServer. Servern bör inte blint ta bort alla poster för sina klasser eftersom andra program kan ha lagrat ytterligare poster, till exempel en TreatAs nyckel.
Om servern är paketerad i en EXE-modul startar programmet som vill registrera servern EXE-servern med kommandoradsargumentet /RegServer eller -RegServer (skiftlägesokänslig). Om programmet vill avregistrera servern startas EXE med kommandoradsargumentet /UnregServer eller -UnregServer. Den självregistrerande EXE identifierar dessa kommandoradsargument och anropar samma åtgärder som en DLL skulle utföra inom DllRegisterServeroch DllUnregisterServer, respektive registrera sin modulsökväg under LocalServer32 i stället för InprocServer32 eller InprocHandler32.
Servern måste registrera den fullständiga sökvägen till installationsplatsen för DLL- eller EXE-modulen för respektive InprocServer32, InprocHandler32och LocalServer32 nycklar i registret. Modulsökvägen hämtas enkelt via funktionen GetModuleFileName.
Relaterade ämnen