Utilizzo di parametri sostituibili (preprocessore del Registrar)

Parametri sostituibili consentono client di un Registrar per specificare i dati della fase di esecuzione. A tale scopo, il Cancelliere mantiene una mappa di sostituzione in cui entra i valori associati i parametri sostituibili nello script. Il Cancelliere rende queste voci in fase di esecuzione. La sezione che segue viene illustrato questi passaggi.

Usando % MODULE %

La creazione guidata oggetto genera automaticamente uno script che utilizza %MODULE% . ATL utilizza questo parametro sostituibile per la posizione effettiva del tuo server DLL o EXE.

Oltre ad aggiungere %MODULE% allo script, guidata oggetto ATL aggiunge anche la seguente riga alla dichiarazione della classe dell'oggetto:

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)

Questa macro si espande per:

statico HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
 nbsp; return _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegistrazione immediata dei bollettini);
}

dove _Module si riferisce al global CComModule, che ha la seguente dichiarazione di metodo e # define:

UpdateRegistryFromResource (UI&NT nResID, BOOL bRegistrazione immediata dei bollettini,
 nbsp;     struct  ATL_REGMAP_ENTRY * pMapEntries = NULL);

# define UpdateRegistryFromResource UpdateRegistryFromResource

Questo metodo chiama AtlModuleUpdateRegistryFromResource , che contiene il seguente codice:

ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp;        LPCOLESTR lpszRes, BOOL bRegistrazione immediata dei bollettini, 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;  Potete trovare questo codice in atl\include\atlimpl.cpp.

CoCreateInstance acquisisce il puntatore p , che indica al Cancelliere. Poi, AddReplacement riceve un LPCOLESTR contenenti la stringa " Module ", così come un LPCOLESTR contenenti la stringa acquistata dalla funzione API Win32, GetModuleFileName. Questo codice aggiunge una voce della mappa di sostituzione per il Module variabile che ha un valore associato con il risultato di GetModuleFileName. Ora, quando il preprocessore vede il %MODULE% nello script, lo sostituirà con il valore da GetModuleFileName.

La concatenazione di dati di runtime con i dati di script

Un altro uso del preprocessore è per concatenare i dati della fase di esecuzione con script. Ad esempio, si supponga che abbiamo bisogno di una voce che contiene un percorso completo di un modulo con la stringa " , 1 " alla fine. In primo luogo, di definire la seguente espansione:

'MyGoofyKey' = '% % modulo, 1' s

Quindi, prima di chiamare uno dei metodi di elaborazione script, aggiungere un sostituto alla mappa:

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

Durante l'analisi dello script, il Cancelliere si espande '%MODULE%, 1' ac:\mycode\mydll.dll, 1.

&Notanbsp;  In uno script Registrar, 4 K è la dimensione massima del token. (Un token è qualsiasi elemento riconoscibile nella sintassi). Ciò include i token che sono stati creati o espansi per il preprocessore.

&Notanbsp;  Per sostituire i valori di sostituzione in fase di esecuzione, rimuovere la chiamata a macro DECLARE_REGISTRY_RESOURCE o DECLARE_REGISTRY_RESOURCEID . Invece, sostituirlo con la funzione membro UpdateRegistry che chiama CComModule::UpdateRegistryFromResourcee passare l'array di strutture ATL_REGMAP_ENTRY . La matrice di ATL_REGMAP_ENTRY deve avere almeno una voce che è impostata su {NULL,NULL}, e questa voce deve essere sempre l'ultima voce. In caso contrario, verrà generato un errore di violazione di accesso quando viene chiamato UpdateRegistryFromResrouce.

Index