Подстановочные параметры позволяют клиенту регистратора для указания данных времени выполнения. Это сделать, секретарь поддерживает замену карты, в который он входит значения, связанные с заменяемых параметров в вашем скрипте. Секретарь делает эти записи во время выполнения. В следующем разделе демонстрируется эти шаги.
Мастер объектов ATL автоматически создает сценарий, который использует %MODULE% . Для фактического местоположения Вашего сервера DLL или EXE ATL использует этот заменяемый параметр.
Помимо добавления %MODULE% в сценарий, ATL объектов мастер также добавляет следующую строку к объявлению класса объекта:
DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)
Этот макрос расширяется в:
статическое значение HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
nbsp; возвращение _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bЗарегистрируйтесь участия);
}
где _Module относится к глобальной CComModule, который имеет следующий метод и # define заявление:
UpdateRegistryFromResource (UI&NT nResID, BOOL bЗарегистрируйтесь участия,
nbsp; Структура _ATL_REGMAP_ENTRY * pMapEntries = NULL);
# define UpdateRegistryFromResource UpdateRegistryFromResource
Этот метод вызывает метод AtlModuleUpdateRegistryFromResource , который содержит следующий код:
ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp; LPCOLESTR lpszRes, BOOL bЗарегистрируйтесь участия, struct _ATL_REGMAP_ENTRY * pMapEntries, IRegistrar * Прег)
{
USES_CONVERSION;
...
Класс CComPtr <IRegistrar> p;
...
TCHAR szModule [_MAX_PATH];
GetModuleFileName (pM - > 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» = s «% MODULE %, 1»
Затем перед вызовом одного из сценария методы обработки, добавьте замена на карту:
TCHAR szModule [_MAX_PATH]
GetModuleFileName (pM-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,значение NULL}, и эта запись должна всегда быть последней записи. В противном случае будет сформирована ошибка нарушения доступа при вызове UpdateRegistryFromResrouce.