非托管C ++ COM和托管C ++ .NET4互操作

时间:2011-05-04 04:28:18

标签: c++ com .net-4.0 clr com-interop

我有一个ATL COM服务,我可以通过我的Windows Forms Application .NET4应用程序连接到该服务,该应用程序大部分是在托管c ++中编写的。

我可以成功检索到接口的指针(通过CoCreateInstance()),但在尝试实现事件接收器时会遇到问题。我希望在应用程序中创建一个非托管c ++类,它实现COM服务器定义的接口,并从ConnectionPoint接收事件。到目前为止我得到了什么:

  • 使用托管(ref class)c ++类实现这是不可能的,我使用的是普通的非托管类。
  • 无法使用任何ATL宏,我需要在sink类中实现IUnknown抽象函数(AddRef,Release,QueryInterface等)。

我可以检索接口的IConnectionPoint指针,但是对Advise()的调用返回E_NOTIMPL。这让我相信我错过了在某处实现某些ATL基本功能,但我不知道从哪里开始。

顺便说一下,我在网上发现很少有关于在托管c ++项目中使用COM的资源。我最接近的是this文章。有没有人对这个问题有任何好的解读?现在它正在破坏我的大脑。

1 个答案:

答案 0 :(得分:1)

在托管C ++应用程序中,使用“添加引用”选项添加对COM服务器的引用,这将为您的COM组件创建一个托管包装器(程序集),您可以在“托管c ++代码”中使用该包装器。 COM组件中的事件应该作为.NET事件提供,可以使用托管C ++中的常规事件处理来处理。

根据您的描述,您似乎正在尝试使用非托管代码来使用托管C ++应用程序中的COM组件,这会使事情变得复杂。混合托管代码和非托管代码应该有明确的界限,跳出这些边界过多会使事情变得复杂并导致其他严重问题。因此,我建议您使用“托管代码”(c ++)来使用COM组件,只需为COM组件创建托管包装。

相关问题