Self-Registration
À medida que o software componente continua a crescer como mercado, haverá cada vez mais casos 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 através 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-registo é o meio padrão através do qual um módulo de servidor pode empacotar as suas próprias operações de registo, tanto de registo como de cancelamento de registo, no próprio módulo. Quando usado com o licenciamento tratado através do IClassFactory2, um servidor pode se tornar um módulo totalmente autônomo 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 destes dados permite a qualquer parte interessada, como uma aplicação que pretenda integrar este novo componente, determinar se o servidor suporta o auto-registo sem ter de carregar primeiro a DLL ou EXE.
Se o servidor é empacotado em um módulo DLL, a DLL deve 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 através da funçãoGetProcAddress. Dentro DllRegisterServer, a DLL cria todas as suas entradas de registro necessárias, armazenando o caminho correto para a DLL para todas as entradas InprocServer32 ou InprocHandler32.
Quando um aplicativo deseja remover o componente do sistema, ele deve cancelar o registro desse componente chamando DllUnregisterServer. Dentro desta chamada, o servidor remove exatamente as entradas que ele criou anteriormente no DllRegisterServer. O servidor não deve remover cegamente todas as entradas de suas classes porque outro software pode 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 deseja cancelar o registro do servidor, ele inicia o EXE com o argumento de linha de comando /UnregServer ou -UnregServer. O EXE de auto-registro deteta esses argumentos de linha de comando e invoca as mesmas operações que uma DLL faria dentro DllRegisterServer e 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 respetivos InprocServer32, InprocHandler32e LocalServer32 chaves no registro. O caminho do módulo é facilmente obtido através da funçãoGetModuleFileName.
Tópicos relacionados