С помощью заменяемых параметров (регистратора препроцессора)

Подстановочные параметры позволяют клиенту регистратора для указания данных времени выполнения. Это сделать, секретарь поддерживает замену карты, в который он входит значения, связанные с заменяемых параметров в вашем скрипте. Секретарь делает эти записи во время выполнения. В следующем разделе демонстрируется эти шаги.

С помощью % MODULE %

Мастер объектов 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.

Index