Иллюстрированный самоучитель по Visual Studio .NET

Загадочные макросы

Вернемся в файл ATLGL.cpp, где кроме функций, перечисленных выше, присутствуют загадочные макросы. Их смысл довольно прозрачен, но разработчика не должны устраивать догадки, ему нужны более точные знания. Сопровождающая документация, особенно бета-версий, не всегда дает нужные объяснения, поэтому приходится искать их самостоятельно в заголовочных файлах, расположенных по адресу: …\Microsoft Visual Studio .NET\Vc7\indude или…\Microsoft Visual Studio .NET\ Vc7\atlmfc\include.

Покажем, как это делается на примере. Нас интересует смысл функциеподобной макроподстановки:

DECLARE_LIBID(LIBID_ATLGLLib)

В результате поиска в файлах по указанному пути (маска поиска должна быть *.h) находим (в файле ATLBase.h), что при разворачивании препроцессором этот макрос превратится в статическую функцию класса CATLGLModule:

static void InitLibldO throw ()
{
CAtlModule::m_libid = LIBID_ATLGLLib;
}

Теперь возникает желание узнать, что кроется за идентификатором LiBiD_ATLGLLib. Во вновь созданном коде файла ATLGM.c находим макрос:

MIDL_DEFINE_GUID(IID,
LIBID_ATLGLLib,ОхЕбОбОЗВС,Ox9DE2, 0x4563,
OxA7.0xAF,Ox8A,Ox8C,Ox4E,0x80.0x40.0x58);

Узнав смысл которого мы сможем понять, чем является LiBiD_ATLGLLib. В вашем проекте цифры будут другими, но я привожу здесь те, которые вижу сейчас, для того чтобы быть более конкретным и не загружать вас абстракциями, которых и так хватает. В этом случае поиск не нужен, так как объявление макроса расположено двумя строчками выше. Вот оно:

#define MIDL_DEFINE_GUID(type,name,1,wl,w2,bl,b2,b3,Ь4, \ b5,Ьб,b7,b8)
const type name = \ {I,wl,w2, {b1,b2,bЗ,b4,b5,b6,b7,b8}
}

Подставив значения параметров из предыдущего макроса, получим определение LiBiD_ATLGLLib, которое увидит компилятор:

const IID LIBID_ATLGLLib =
{
0xE60605BC, 0x9DE2, 0x4563,
{ 0xA7.0xAF,0x8A, 0x8C,Ox4E, 0x80, 0x40, 0x58 }
}

Отсюда ясно, что LIВID_АТLGLLib – это константная структура типа IID. Осталось узнать, как определен тип данных IID.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.