Sdílet prostřednictvím


Self-Registration

Vzhledem k tomu, že software komponent stále roste jako trh, bude existovat více a více instancí, kde uživatel získá novou softwarovou komponentu jako jeden modul DLL nebo EXE, například při stahování nové komponenty z on-line služby nebo příjem jedné z přítele na disketě. V těchto případech není praktické vyžadovat, aby uživatel prošel zdlouhavým instalačním postupem nebo instalačním programem. Kromě problémů s licencováním, které jsou zpracovávány prostřednictvím IClassFactory2, instalační postup obvykle vytváří potřebné položky registru pro komponentu, aby se správně spouštěla v kontextu COM a OLE.

Samoobslužná registrace je standardní způsob, jakým může modul serveru zabalit své vlastní operace registru, registraci i zrušení registrace do samotného modulu. Při použití s licencováním zpracovaným prostřednictvím IClassFactory2se server může stát zcela samostatným modulem bez nutnosti externích instalačních programů nebo .reg souborů.

Všechny moduly, knihovny DLL nebo EXE, by nejprve měly obsahovat řetězec "OleSelfRegister" v StringFileInfo oddílu s informacemi o verzi, jak je znázorněno zde.

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 
 

Existence těchto dat umožňuje jakékoli zúčastněné straně, například aplikaci, která chce tuto novou komponentu integrovat, určit, zda server podporuje vlastní registraci bez nutnosti načíst knihovnu DLL nebo EXE jako první.

Pokud je server zabalen v modulu DLL, musí knihovna DLL exportovat funkce DllRegisterServer a DllUnregisterServer. Každá aplikace, která chce dát serveru pokyn, aby se zaregistroval sám (tj. všechny jeho IDENTIFIKÁTORy CLSI a ID knihovny typů), může získat ukazatel na DllRegisterServer prostřednictvím funkce GetProcAddress. V DllRegisterServer, KNIHOVNA DLL vytvoří všechny potřebné položky registru, uloží správnou cestu ke knihovně DLL pro všechny InprocServer32 nebo InprocHandler32 položky.

Pokud aplikace chce odebrat komponentu ze systému, měla by zrušit registraci této komponenty voláním DllUnregisterServer. V rámci tohoto volání server odebere přesně ty položky, které předtím vytvořil v DllRegisterServer. Server by neměl nevidomě odebírat všechny položky pro své třídy, protože jiný software mohl ukládat další položky, například TreatAs klíč.

Pokud je server zabalený v modulu EXE, aplikace, která chce zaregistrovat server, spustí exe server s argumentem příkazového řádku /RegServer nebo -RegServer (nerozlišuje velká a malá písmena). Pokud aplikace chce zrušit registraci serveru, spustí exe s argumentem příkazového řádku /UnregServer nebo -UnregServer. Nástroj EXE, který sám registruje tyto argumenty příkazového řádku a vyvolá stejné operace jako knihovna DLL by v rámci DllRegisterServera DllUnregisterServer, v uvedeném pořadí, registrace jeho cesty modulu v LocalServer32 místo InprocServer32 nebo InprocHandler32.

Server musí zaregistrovat úplnou cestu k umístění instalace modulu DLL nebo EXE pro příslušné InprocServer32, InprocHandler32a LocalServer32 klíče v registru. Cesta k modulu se snadno získá prostřednictvím funkce GetModuleFileName.

instalace jako aplikace služby

registrace třídy v instalačním

registrace spuštěného serveru EXE

registrace objektů v ROT