我正在尝试从mingw项目访问imapi2 com对象。我试图遵循一个视觉工作室的例子。我在Microsoft SDK 7.1中找到了imapi2头文件,但它们似乎没有uuid。我看到的示例在创建对象时使用__uuidof查找uuid。像这样:

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

但是我总是因为__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 ()”几行

为什么__mingw_uuidof的mingw定义不起作用?

有什么方法可以在sdk头文件中找到像DiscMaster这样的imapi对象的uuid?还是我需要获取其他头文件。

谢谢

最佳答案

微软Platform SDK中的COM接口(interface)通常由.idl文件定义,它们使用midl从其中生成.h文件。因此,只需查找CLSID或IID值即可搜索idl文件。在这种情况下,imapi2.idl具有您所需的guid,并且已用于生成具有以下内容的imapi2.h文件:

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

Microsoft编译器中的__uuidof扩展名通过特定于编译器的declspec语句读取附加到类或结构的特定于编译器的数据。您可以使用以下方法进行操作:
struct declspec(uuid("{......}")) IMyInterfaceType;

因此,上面的DECLSPEC_UUID行将该guid附加到该类。

您从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。

08-17 04:47