Загадочные макросы
В хорошо знакомом файле afxwin.h находим определение typedef GUID IID;. Про Globally Unique Identifier (GUID) сказано очень много, в том числе и в документации Studio .NET. Как мы только что выяснили, изучив работу макросов и LiBio_ATLGLLib, тип IID также используется для идентификации библиотек типов. Система применяет два типа GUID: строковый в реестре, и числовой в клиентских приложениях. Второй макрос, который вы видели в классе:
CATLGLModule: DECLARE_REGISTRY_APPID_RESOURCEID(IDR_ATLGL, "{E4541023-7425-4AA7-998C-D016DF796716}")
(цифры мои, ваши будут другими) создает строковый GUID. При расширении он превратится в три статические функции класса, две из которых готовят текстовую строку того или иного типа, а третья регистрирует, в случае если bRegister==TRUE, или убирает из реестра эту строку по адресу HKEY_CLASSES_ROOT\APPID\:
static LPCOLESTR GetAppId () throw () { //====== Преобразование к формату OLE-строки return OLESTR("{E4541023-7425-4AA7-998C-D016DF796716}"); } static TCHAR* GetAppIdTO throw () { //====== Преобразование к Unicode или char* строке return _T("{E4541023-7425-4AA7-998C-D016DF796716}"); } // Если bRegister==TRUE, то происходит запись в реестр, // иначе – удаление записи static HRESULT WINAPI UpdateRegistryAppId(BOOL bRegister) throw() { _ATL_REGMAP_ENTRY aMapEntries [] = { { OLESTRC'APPID"), GetAppIdO }, { NULL, NULL } }; return ATL::_pAtlModule › UpdateRegistryFromResource(IDR ATLGL, bRegister, aMapEntries);
В данный момент вы сможете найти в реестре свой ключ и ассоциированную с ним строку (ATLGL) по адресу:
HKEY_CLASSES_ROOT\AppID\ {E4541023-7425-4AA7-998C-D016DF796716}
При запуске приложения вышеописанные функции были вызваны каркасом приложения и произвели записи в реестр. Отметьте также, что в реестре появилась еще одна (симметричная) запись по адресу HKEY_CLASSES_ROOT \APPID\ATLGL.DLL. Она ассоциирует строковый GUID с библиотекой ATLGL.DLL. Рассматриваемая строка-идентификатор встречается еще в нескольких разделах проекта, найдите их, чтобы получить ориентировку: в ресурсе REGISTRY" › IDR_ATLGL (см. окно Resource View) и в файле сценария регистрации ATL.GL.rgs (см. окно Solution Explorer).
Возвращаясь к первому макросу DECLARE_LIBID(LiBiojvTLGLLib), отметим, что скрытая за ним функция initLibid тоже была вызвана каркасом и использована для регистрации библиотеки типов будущего СОМ-объекта. Вы можете найти эту, значительно более подробную, запись по ключу (цифры мои):
HKEY_CLASSES_ROOT\TypeLib\ {E60605BC-9DE2-4563-A7AF-8A8C4E804058}