Compartilhar via


Self-Registration

À medida que o software de componente continua a crescer como um mercado, haverá cada vez mais instâncias em que um usuário obtém um novo componente de software como um único módulo DLL ou EXE, como ao baixar um novo componente de um serviço on-line ou receber um de um amigo em um disquete. Nesses casos, não é prático exigir que o usuário passe por um longo procedimento de instalação ou programa de instalação. Além dos problemas de licenciamento, que são tratados por meio de IClassFactory2, um procedimento de instalação normalmente cria as entradas de registro necessárias para que um componente seja executado corretamente no contexto COM e OLE.

O auto-registro é o meio padrão por meio do qual um módulo de servidor pode empacotar suas próprias operações de registro, registro e cancelamento de registro, no próprio módulo. Quando usado com o licenciamento tratado por meio IClassFactory2, um servidor pode se tornar um módulo totalmente autocontido sem necessidade de programas de instalação externos ou arquivos .reg.

Qualquer módulo de auto-registro, DLL ou EXE, deve primeiro incluir uma cadeia de caracteres "OleSelfRegister" na seção StringFileInfo de seu recurso de informações de versão, conforme mostrado aqui.

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 
 

A existência desses dados permite que qualquer parte interessada, como um aplicativo que deseja integrar esse novo componente, determine se o servidor dá suporte ao auto-registro sem precisar carregar a DLL ou o EXE primeiro.

Se o servidor estiver empacotado em um módulo DLL, a DLL deverá exportar as funções DllRegisterServer e DllUnregisterServer. Qualquer aplicativo que deseje instruir o servidor a se registrar (ou seja, todos os seus CLSIDs e IDs de biblioteca de tipos) pode obter um ponteiro para DllRegisterServer por meio da função GetProcAddress. Em DllRegisterServer, a DLL cria todas as suas entradas de registro necessárias, armazenando o caminho correto para a DLL para todas as entradas de inprocServer32 ou inprocServer32.

Quando um aplicativo deseja remover o componente do sistema, ele deve cancelar o registro desse componente chamando DllUnregisterServer. Nessa chamada, o servidor remove exatamente as entradas criadas anteriormente no DllRegisterServer. O servidor não deve remover cegamente todas as entradas de suas classes porque outros softwares podem ter armazenado entradas adicionais, como uma chave TreatAs.

Se o servidor estiver empacotado em um módulo EXE, o aplicativo que deseja registrar o servidor iniciará o servidor EXE com o argumento de linha de comando /RegServer ou -RegServer (não diferencia maiúsculas de minúsculas). Se o aplicativo quiser cancelar o registro do servidor, ele iniciará o EXE com o argumento de linha de comando /UnregServer ou -UnregServer. O EXE de auto-registro detecta esses argumentos de linha de comando e invoca as mesmas operações que uma DLL em DllRegisterServere DllUnregisterServer, respectivamente, registrando seu caminho de módulo em localServer32 em vez de InprocServer32 ou InprocHandler32.

O servidor deve registrar o caminho completo para o local de instalação do módulo DLL ou EXE para seus respectivos InprocServer32, InprocHandler32e chaves de LocalServer32 no registro. O caminho do módulo é facilmente obtido por meio da funçãoGetModuleFileName.

instalando como um aplicativo de serviço

registrar uma classe no de instalação

registrando um servidor EXE em execução

registrando objetos no ROT