2011-05-04 174 views
1

我有一个ATL COM服务,可以通过我的Windows窗体应用程序.NET4应用程序连接到大多数托管C++应用程序。非托管C++ COM和托管C++ .NET4互操作

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

  • 意识到这是不可能的使用托管(ref class)C++类,我正在使用一个正常的非托管类。
  • 不能使用任何ATL宏,我需要在接收器类中实现IUnknown抽象函数(AddRef,Release,QueryInterface等)。

我可以检索接口的IConnectionPoint指针,但对Advise()的调用返回E_NOTIMPL。这使我相信我错过了在某处实现某些ATL基本功能,但我不知道从哪里开始。另外,我在网上发现了很少有关在托管C++项目中使用COM的资源。最近我来到是this文章。有人对这个主题有什么好的看法吗?它现在正在破坏我的大脑。

回答

1

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

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

+0

感谢您的回复。你是对的,我混淆了混合托管和非托管代码。 “添加参考”选项在哪里存在?你有没有链接到这种方法的文档? – 2011-05-04 04:49:35

+1

只需右键单击该项目,即可看到添加参考。它将打开一个对话框,其中将显示“COM”选项卡,打开该选项卡,您将看到系统上所有已注册的COM组件。基本上这只是Tlbimp.exe之上的IDE功能。这是用于为COM创建托管包装的工具。请参阅:http://msdn.microsoft.com/en-us/library/tt0cf3sx(VS.80).aspx – Ankur 2011-05-04 05:41:34