Parametrów zastępowalnych umożliwiają Registrar klienta do określenia czasu wykonywania danych. Aby to zrobić, Sekretarz utrzymuje mapy zastąpienia, do którego wchodzi wartości skojarzone z parametrów zastępowalnych w skrypcie. Sekretarz sprawia, że te wpisy w czasie wykonywania. Następująca sekcja pokazuje następujące kroki.
Kreator obiektu ATL automatycznie generuje Skrypt używający %MODULE% . ATL używa tego parametrów wymiennych dla rzeczywistych lokalizacji serwera biblioteki DLL lub EXE.
Oprócz dodawania %MODULE% do skryptu, Kreator obiektu ATL również dodaje następujący wiersz do deklaracji klasy obiektu:
DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)
To makro jest rozszerzany, aby:
statyczne HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
nbsp; Zwraca _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bZarejestruj);
}
gdzie _Module odnosi się do globalnego CComModule, który ma następującą instrukcję metody i # define:
UpdateRegistryFromResource (UI&NT nResID, BOOL bZarejestruj,
nbsp; struct _ATL_REGMAP_ENTRY * pMapEntries = NULL);
# define UpdateRegistryFromResource UpdateRegistryFromResource
Ta metoda wymaga AtlModuleUpdateRegistryFromResource , który zawiera poniższy kod:
ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp; LPCOLESTR lpszRes, BOOL bZarejestruj, struktura _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));
...
}
Uwaga Kod ten można znaleźć w atl\include\atlimpl.cpp.
Funkcji CoCreateInstance nabywa wskaźnik p , która wskazuje Sekretarza. AddReplacement otrzyma następnie, LPCOLESTR zawierających ciąg „ Module ", jak również LPCOLESTR zawierających ciąg nabyte od funkcji Win32 API GetModuleFileName. Ten kod dodaje wpis mapę zastępcze dla Module zmienną, która ma wartość związane z wynikiem GetModuleFileName. Teraz, kiedy preprocesora widzi %MODULE% w skrypcie go zastąpi ją z wartością z GetModuleFileName.
Innym zastosowaniem preprocesora jest złączyć czasu wykonywania danych z danymi skryptu. Na przykład, załóżmy, że potrzebujemy wpis, który zawiera pełną ścieżkę do modułu z ciągiem " , 1 " dołączana na końcu. Najpierw należy zdefiniować następujące rozszerzenia:
'MyGoofyKey' = s '% modułu % 1'
Następnie przed wywołaniem metody przetwarzania skryptu, dodać do mapy zastąpienia:
TCHAR szModule [_MAX_PATH]
GetModuleFileName (pM-gt; m_hInst, szModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))
Podczas analizowania skryptu, rozszerza się Sekretarz '%MODULE%, 1' doc:\mycode\mydll.dll, 1.
Uwaga W skrypcie Sekretarza 4 K jest maksymalnego rozmiaru żetonu. (Token jest każdy rozpoznawalny element składnia). Obejmuje to tokeny, które zostały utworzone lub rozwinięta przez preprocesora.
Uwaganbsp; Aby zastąpić wartości zastępczych w czasie wykonywania, należy usunąć wywołanie makra DECLARE_REGISTRY_RESOURCE lub DECLARE_REGISTRY_RESOURCEID . Zamiast tego zastąpić własną funkcję Państwa UpdateRegistry , która wywołuje CComModule::UpdateRegistryFromResourcei przekazać macierzy _ATL_REGMAP_E&NTRY struktur. Z tablicy _ATL_REGMAP_ENTRY musi mieć co najmniej jeden wpis, który jest ustawiony na {wartość NULL,NULL}, a wpis ten należy zawsze ostatniego zapisu. Inaczej zostanie wygenerowany błąd naruszenia zasad dostępu jest po wywołaniu UpdateRegistryFromResrouce.