найти / uuid / заголовки для объектов imapi2 com или заставить __uuidof работать на mingw

Я пытаюсь получить доступ к объектам imapi2 com из проекта Mingw. Я пытался следовать примеру визуальной студии. Я нашел заголовочные файлы imapi2 в Microsoft SDK 7.1, но, похоже, они не содержат uuid. Пример, который я видел, использовал __uuidof для поиска uuid при создании объекта. Как это:

CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2), (void**) &m_discMaster);

Но я всегда получаю сообщение об ошибке из-за __uuidof, то есть

неопределенная ссылка на _GUID const& __mingw_uuidof ().

Но __mingw_uuidof определяется как …

#define __CRT_UUID_DECL(type,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)           \
extern "C++" {                                                      \
template<> inline const GUID &__mingw_uuidof<type>() {              \
static const IID __uuid_inst = {l,w1,w2, {b1,b2,b3,b4,b5,b6,b7,b8}}; \
return __uuid_inst;                                             \
}                                                                   \
template<> inline const GUID &__mingw_uuidof<type*>() {             \
return __mingw_uuidof<type>();                                  \
}                                                                  \
}

… в _mingw.h несколько строк вверх от «#define __uuidof (type) __mingw_uuidof<__typeof (тип)> ()»

Почему определение mingw для __mingw_uuidof не работает?

Есть ли способ найти uuid для объектов imapi, таких как DiscMaster, в заголовочных файлах sdk? Или мне нужно получить другой файл заголовка.

Спасибо

3

Решение

COM-интерфейсы в Microsoft Platform SDK обычно определяются .idl-файлами и из них генерируют .h-файлы, используя midl. Поэтому, чтобы просто посмотреть значения CLSID или IID, найдите файл idl. В этом случае у imapi2.idl есть нужный вам guid, и он был использован для создания файла imapi2.h с:

class DECLSPEC_UUID("2735412E-7F64-5B0F-8F00-5D77AFBE261E")
MsftDiscMaster2;

Расширение __uuidof в компиляторах Microsoft считывает данные, специфичные для компилятора, присоединенные к классу или структуре с помощью специального выражения declspec для компилятора. Вы можете сделать это используя:

struct declspec(uuid("{......}")) IMyInterfaceType;

Таким образом, строка DECLSPEC_UUID выше прикрепляет этот указатель к классу.

Пример кода, который вы передаете из mingw, предоставляет шаблонную функцию, которая будет возвращать uuid для данного типа, если вы сначала установили тип с помощью __CRT_UUID_DECL. Может случиться так, что у них есть система для автоматического вызова, но это не показано. Учитывая то, что я вижу в вашем примере, чтобы __uuidof работал для данного coclass, вам нужно добавить:

__CRT_UUID_DECL(MsftDiscMaster2, 0x2735412e, 0x7f64, 0x5b0f, 0x8f, 0x00, 0x5d, 0x77, 0xaf, 0xbe, 0x26, 0x1e);

После этого заявления у вас будет определение __uuidof(MsftDiscMaster2) это вернет правильный UUID.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]