Usando parâmetros Replaceable (Preprocessor da Registrar)

Parâmetros substituíveis permitem que cliente do registrador especificar dados de tempo de execução. Para fazer isso, o Registrar mantém um mapa de substituição no qual ele insere os valores associados com os parâmetros substituíveis em seu script. O Registrar torna essas entradas em tempo de execução. A seção a seguir demonstra estas etapas.

Usando % módulo %

O Assistente de objeto ATL gera automaticamente um script que usa %MODULE% . ATL usa esse parâmetro substituível para a localização real do seu servidor DLL ou EXE.

Além de adicionar %MODULE% para o script, o Assistente de objeto ATL também adiciona a seguinte linha a declaração de classe do objeto:

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)

Essa macro se expande para:

estático HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
 nbsp; retornar _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegister);
}

onde _Module refere-se para o global CComModule, que tem a seguinte declaração de método e # define:

UpdateRegistryFromResource (UI&NT nResID, BOOL bRegister,
 nbsp;     struct  ATL_REGMAP_ENTRY * pMapEntries = NULL);

# Definir UpdateRegistryFromResource UpdateRegistryFromResource

Este método chama AtlModuleUpdateRegistryFromResource , que contém o seguinte código:

ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp;        LPCOLESTR lpszRes, BOOL bRegister, struct  ATL_REGMAP_ENTRY * pMapEntries, IRegistrar * pReg)
{
   USES_CONVERSION;
   ...
   CComPtr <IRegistrar> p;
   ...

TCHAR szModule [ MAX_PATH];
   GetModuleFileName (pM - > m_hInst, szModule,  MAX_PATH);
   p - > AddReplacement(OLESTR("Module"), T2OLE(szModule));

...
}

&Notanbsp;  Você pode encontrar esse código em atl\include\atlimpl.cpp.

CoCreateInstance adquire o ponteiro de p , que aponta para o escrivão. Então, AddReplacement recebe um LPCOLESTR que contém a Cadeia de caracteres " Module ", bem como um LPCOLESTR que contém a Cadeia de caracteres adquirida a partir de API do Win32 função, GetModuleFileName. Este código adiciona uma entrada de mapa de substituição para o Module variável que possui um valor associado com o resultado de GetModuleFileName. Agora, quando vê o pré-processador do %MODULE% no script, ele irá substituí-lo com o valor de GetModuleFileName.

Concatenação de dados de tempo de execução com dados de script

Outro uso do pré-processador é concatenar dados de tempo de execução com dados de script. Por exemplo, suponha que precisamos de uma entrada que contém um caminho completo para um módulo com a Cadeia de caracteres " , 1 " anexado ao final. Em primeiro lugar, definir a seguinte expansão:

'MyGoofyKey' = '% MODULE %, 1' s

Então, antes de chamar um do script métodos de processamento, adicionar uma substituição para o mapa:

TCHAR szModule [ MAX_PATH]
GetModuleFileName (pM-gt; m_hInst, szModule,  MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))

Durante a análise do script, o Registrar expande '%MODULE%, 1' parac:\mycode\mydll.dll, 1.

&Notanbsp;  Em um script de registrador, 4 K é o tamanho de token máximo. (Um token é qualquer elemento reconhecível na sintaxe.) Isso inclui os tokens que foram criados ou expandidos pelo pré-processador.

&Notanbsp;  Para substituir valores de substituição em tempo de execução, remova a chamada para o DECLARE_REGISTRY_RESOURCE ou DECLARE_REGISTRY_RESOURCEID macro. Em vez disso, substituí-lo com sua própria função de membro UpdateRegistry que chama CComModule::UpdateRegistryFromResourcee passar a matriz de ATL_REGMAP_ENTRY estruturas. Sua matriz de ATL_REGMAP_ENTRY deve ter pelo menos uma entrada que é definida como {NULL,NULL}, e esta entrada deve ser sempre a última entrada. Caso contrário, será gerado um erro de violação de acesso quando UpdateRegistryFromResrouce é chamado.

Index