Auto-Cadastro
À medida que o software de componente continua a crescer como 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 configuraçã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 através do qual um módulo de servidor pode empacotar suas próprias operações de registro, tanto de registro quanto de cancelamento, no próprio módulo. Quando usado com licenciamento manipulado por meio do IClassFactory2, um servidor pode se tornar um módulo totalmente autônomo sem a 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 suporta o auto-registro sem ter que carregar a DLL ou EXE primeiro.
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 por meio da função GetProcAddress. Dentro de 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 dessa chamada, o servidor remove exatamente as entradas que ele criou anteriormente em 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 (sem distinção entre maiúsculas e 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 registro automático detecta esses argumentos de linha de comando e invoca as mesmas operações que uma DLL faria em 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 suas respectivas chaves InprocServer32, InprocHandler32 e LocalServer32 no registro. O caminho do módulo é facilmente obtido através da função GetModuleFileName.
Tópicos relacionados