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.
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.
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.