在 C++ 中使用 COM 互操作对象

Posted

技术标签:

【中文标题】在 C++ 中使用 COM 互操作对象【英文标题】:Using COM Interop Objects from C++ 【发布时间】:2013-07-30 18:07:59 【问题描述】:

我有一个为 COM Interop 注册的 .NET 库,我从 VB6 代码中成功使用它(因此,它已正确注册,这不是问题)

发生的情况是我试图通过 C++ 代码(一个 MFC ActiveX 控件)使用同一个库,我什至无法实例化对象 (是的,它有一个无参数构造函数)。

假设命名空间是Foo,类的名称是Bar。我将如何实例化这样的对象?我正在尝试这个:

在 .h 文件中:

Foo::Bar *obj;

在 .cpp 文件上,在 ActiveX 控件的构造函数上:

obj = new Foo::Bar();

我收到以下错误:

«不允许输入不完整类型»»; «错误 C2027:使用未定义类型 'Foo::Bar'»。

所以基本上我的问题是:如何从 C++ 代码中使用 .NET COM 互操作对象?

【问题讨论】:

您还没有接近编写正确的 C++ 代码。从#import directive开始走近一点,一本书肯定也无妨。 我显然在使用#import 指令。我省略了它,因为我认为这对每个人来说都是显而易见的。我熟悉 C++,不熟悉 Windows 或 COM Interop。 【参考方案1】:
CComObject<Foo::Bar>* obj;
HRESULT hr = CComObject<Foo::Bar>::CreateInstance(&obj);
//check hr

或者,如果您想使用 IBar 实现的 IBar 接口:

CComPtr<Foo::IBar> pIObj;
HRESULT hr = pIObj.CreateInstance(__uuidof(Foo::Bar));
//check hr

正如 Hans 在他的评论中所建议的,您将希望使用 #import 指令来导入类型库。

【讨论】:

非常感谢,埃里克!你的第二个建议我已经成功了(使用接口和实现它的类型)。 @amgcgoncalves 很高兴听到!祝您使用 COM 工作顺利。如果您不习惯,可能会有点难以处理。【参考方案2】:

在C++中,首先要初始化COM,然后通过UUID获取COM对象,就可以使用这个COM对象的功能,完成后,取消初始化COM。所以代码会是这样的:

CoInitialize(NULL);

IMyClassPtr myClass = IMyClassPtr(_uuid(myClass));
if (myClass != NULL)
   
     myClass->DoSomething();
 

 CoUnitialize();

【讨论】:

以上是关于在 C++ 中使用 COM 互操作对象的主要内容,如果未能解决你的问题,请参考以下文章

在 COM 互操作方法中将字符串作为参数传递

COM 互操作性需要强命名程序集?

COM如何实现语言互操作?

COM 互操作:C# COM 类包装器引发异常

通过互操作将字符串数组从 C# 传递到 C++

COM 互操作中动态代码的内存泄漏