Utilizando parámetros reemplazables (preprocesador del Secretario)

Parámetros reemplazables permiten cliente del Secretario especificar datos en tiempo de ejecución. Para ello, el Secretario mantiene un mapa de reemplazo en el que entra los valores asociados a los parámetros reemplazables en la secuencia de comandos. El registrador hace estas entradas en tiempo de ejecución. La siguiente sección muestra estos pasos.

Utilizando el módulo %

El Asistente para objetos ATL genera automáticamente una secuencia de comandos que utiliza %MODULE% . ATL utiliza este parámetro reemplazable por la ubicación real de su servidor archivos DLL o EXE.

Además de agregar %MODULE% a la secuencia de comandos del Asistente para objetos ATL también agrega la siguiente línea a la declaración de la clase del objeto:

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)

Esta macro se expande a:

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

donde _Module se refiere a la global CComModule, que tiene la siguiente declaración de método y # define:

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

# define UpdateRegistryFromResource UpdateRegistryFromResource

Este método llama a AtlModuleUpdateRegistryFromResource , que contiene el siguiente código:

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

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

...
}

&Notanbsp;  Puede encontrar este código en atl\include\atlimpl.cpp.

CoCreateInstance adquiere el puntero p , que apunta al Secretario. A continuación, AddReplacement recibe un LPCOLESTR que contiene la cadena " Module ", así como un LPCOLESTR que contiene la cadena que adquirió de la función API de Win32 GetModuleFileName. Este código añade una entrada de mapa de reemplazo para el Module variable que tiene un valor asociado con el resultado de GetModuleFileName. Ahora, cuando se ve el preprocesador del %MODULE% en la secuencia de comandos, reemplazará por el valor de GetModuleFileName.

Concatenar datos de tiempo de ejecución con los datos de secuencia de comandos

Otro uso del preprocesador es concatenar datos de tiempo de ejecución con los datos de secuencia de comandos. Por ejemplo, supongamos que tenemos una entrada que contiene una ruta de acceso completa a un módulo con la cadena " , 1 " anexado al final. En primer lugar, definir la siguiente expansión:

'MyGoofyKey' = s 'módulo % 1'

A continuación, antes de llamar a uno de la secuencia de comandos métodos de procesamiento, agregar un reemplazo al mapa:

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

Durante el análisis de la secuencia de comandos, se expande el Secretario '%MODULE%, 1' ac:\mycode\mydll.dll, 1.

&Notanbsp;  En una secuencia de comandos del registrador, 4 K es el tamaño máximo del símbolo (token). (Un símbolo (token) es cualquier elemento reconocible en la sintaxis). Esto incluye símbolos que se crearon o ampliadas por el preprocesador.

&Notanbsp;  Sustituir valores de reemplazo en tiempo de ejecución, elimine la llamada a la macro DECLARE_REGISTRY_RESOURCE o DECLARE_REGISTRY_RESOURCEID . En cambio, reemplazar con su propia función de miembro de UpdateRegistry llama CComModule::UpdateRegistryFromResourcey pasar su matriz de estructuras _ATL_REGMAP_ENTRY . La matriz de _ATL_REGMAP_ENTRY debe tener al menos una entrada que se establece en {NULL,NULL}, y esta entrada debe ser siempre la última entrada. De lo contrario, se generará un error de infracción de acceso cuando se llama a UpdateRegistryFromResrouce.

Index