C++ 查找uuid';用于imapi2 com对象的s/Header或获取uuuIdof以处理mingw
我正在尝试从mingw项目访问imapi2 com对象。我试图遵循一个VisualStudio示例。我在MicrosoftSDK7.1中找到了imapi2头文件,但它们似乎没有uuid。我看到的示例是在创建对象时使用uuuidof查找uuid。像这样:C++ 查找uuid';用于imapi2 com对象的s/Header或获取uuuIdof以处理mingw,c++,mingw,comobject,imapi,C++,Mingw,Comobject,Imapi,我正在尝试从mingw项目访问imapi2 com对象。我试图遵循一个VisualStudio示例。我在MicrosoftSDK7.1中找到了imapi2头文件,但它们似乎没有uuid。我看到的示例是在创建对象时使用uuuidof查找uuid。像这样: CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2), (void**) &m_discMaster)
CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2), (void**) &m_discMaster);
但我总是会出错,因为
对_guidconst&u mingw\u uuidof()的未定义引用
但是uuu mingw_uuuuidof的定义是
#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>(); \
} \
}
#定义(类型,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)\
外部“C++”{\
模板内联常量GUID&\uuuu mingw\uuidof(){\
静态常数IID uuuid_uinst={l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}\
返回仪表\
} \
模板内联常量GUID&\uuuu mingw\uuidof(){\
返回uuu mingw_uuidof()\
} \
}
。。。在_mingw.h中,从“#define uu uuidof(type)uu mingw uuidof()”开始的几行
为什么mingw的定义不起作用
有没有办法在sdk头文件中找到像DiscMaster这样的imapi对象的uuid?或者我需要获取其他头文件
感谢微软平台SDK中的COM接口通常由.idl文件定义,它们使用midl从中生成.h文件。因此,要查找CLSID或IID值,请搜索idl文件。在本例中,imapi2.idl具有所需的guid,并且已用于生成具有以下内容的imapi2.h文件:
class DECLSPEC_UUID("2735412E-7F64-5B0F-8F00-5D77AFBE261E")
MsftDiscMaster2;
Microsoft编译器中的u_uidof扩展读取特定于编译器的declspec语句附加到类或结构的特定于编译器的数据。您可以使用以下方法执行这些操作:
struct declspec(uuid("{......}")) IMyInterfaceType;
因此,上面的DECLSPEC_UUID行将该guid附加到类
您从mingw提供的示例代码提供了一个模板函数,该函数将返回给定类型的uuid,前提是您首先使用uu_CRT_uuid_DECL设置该类型。这可能是因为他们有一个系统自动调用,但没有显示。根据我在您的示例中看到的情况,要使uuuiDof为给定的coclass工作,您需要添加:
__CRT_UUID_DECL(MsftDiscMaster2, 0x2735412e, 0x7f64, 0x5b0f, 0x8f, 0x00, 0x5d, 0x77, 0xaf, 0xbe, 0x26, 0x1e);
在该语句之后,您将有一个
\uu uuidof(MsftDiscMaster2)
的定义,该定义将返回正确的uuid。我要告诉您的可能重复之处是我需要从idl文件中生成一个头文件。MS SDK已经有一个imapi2.h文件。我在VisualStudio中创建了一个项目,它似乎没有生成更有用的头文件。然后我使用了midl,但它生成了一个非常类似imapi2.h的头文件。我找到了另一个可能的工具,但还没有时间尝试。谢谢@patthoys的回答。对于其他任何人来说,为了让它发挥作用,我将imapi2.h文件添加到我的项目中,然后找到我所需的每个com对象的id,并将编号从类DECLSPEC_UUID(“2735412E-7F64-5B0F-8F00-5D77AFBE261E”)
类型命令复制到\uu CRT_UUID_DECL(MsftDiscMaster2,0x2735412e,0x7f64,0x5b0f,0x8f,0x00,0x5d,0x77,0xaf,0xbe,0x26,0x1e);
命令。然后,我将所有这些uu CRT_UUID_DECL写入我自己的头文件。