Змінні параметри дозволяють до реєстратора клієнта, щоб визначити час виконання даних. Для цього у реєстроутримувача підтримує мапі заміна, в якому він входить значення, пов'язані з змінного параметри у ваш сценарій. Реєстратор робить ці записи під час виконання. Наступний розділ показує такі дії.
ATL об'єкт майстер автоматично створює сценарій, який використовує %MODULE% . ATL використовує цей змінного параметра для фактичного місцезнаходження вашого сервера DLL або EXE.
Крім %MODULE% до сценарію, ATL об'єкт майстер також додає такий рядок декларації клас об'єкта:
DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)
Цей макрос розширюється до:
статичний HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
nbsp; повернення _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegister);
}
де _Module вказує на глобальному CComModule, який має такий метод і # визначити оператор:
UpdateRegistryFromResource (UI&NT nResID, BOOL bRegister,
nbsp; Структура _ATL_REGMAP_ENTRY * pMapEntries = NULL);
# визначити UpdateRegistryFromResource UpdateRegistryFromResource
Цей метод вимагає AtlModuleUpdateRegistryFromResource , який містить такий код:
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 (вечора - > m_hInst, szModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule));
...
}
Примітка Ви можете знайти цей код в atl\include\atlimpl.cpp.
CoCreateInstance набуває вказівник p , що вказує реєстратора. Потім, AddReplacement отримує в LPCOLESTR , що містять рядок " Module ", а також на LPCOLESTR , що містять рядок, отримані від функції Win32 API, GetModuleFileName. Цей код додає записі карти заміна для на Module змінна, яка має значення, пов'язані з результатом GetModuleFileName. Тепер, коли що препроцесор бачить в %MODULE% в сценарій, вона буде замінити його значення з GetModuleFileName.
Інше використання що препроцесор є об'єднання даних про час виконання сценарію даних. Наприклад, припустимо, що ми повинні запис, який містить повний шлях до модуля з рядка " , 1 " дописується в кінці. По-перше, визначити такі розширення:
'MyGoofyKey' = 'МОДУЛЬ %, 1' s
Потім перед викликом один сценарій, які методи обробки, додайте заміна на карту:
TCHAR szModule [_MAX_PATH]
GetModuleFileName (вечора gt m_hInst, szModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))
Під час розбору сценарій, реєстратора розширює '%MODULE%, 1' доc:\mycode\mydll.dll, 1.
Примітка У сценарії реєстратора 4 K є максимального розміру маркера. (Маркер-це будь-який невідомий елемент у синтаксис). Це включає в себе маркери, створених або збільшився на що препроцесор.
Приміткаnbsp; Щоб замінити заміна значення під час виконання, видалити виклику DECLARE_REGISTRY_RESOURCE або DECLARE_REGISTRY_RESOURCEID макросів. Замість цього, замінити його на власний UpdateRegistry член функція, яка вимагає CComModule::UpdateRegistryFromResourceі передати ваші масиву _ATL_REGMAP_E&NTRY структур. Ваш масив _ATL_REGMAP_ENTRY потрібно мати принаймні один запис, який настроєно для {NULL,ПУСТІ}, і Ця запис повинен завжди бути останній запис. В іншому випадку, буде створено порушенням прав доступу при UpdateRegistryFromResrouce називається.