Загадочные макросы
Вернемся в файл 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.