非托管C++;COM和托管C++。NET4互操作 我有一个ATL COM服务,我可以通过我的Windows窗体应用程序连接到.NET4应用程序,它是在托管C++的大部分中编写的。

非托管C++;COM和托管C++。NET4互操作 我有一个ATL COM服务,我可以通过我的Windows窗体应用程序连接到.NET4应用程序,它是在托管C++的大部分中编写的。,c++,com,.net-4.0,clr,com-interop,C++,Com,.net 4.0,Clr,Com Interop,我可以成功地检索到指向接口的指针(通过CoCreateInstance()),但在尝试实现事件接收器时遇到问题。我希望在应用程序中创建一个非托管C++类,它实现了COM服务器定义的接口,并从连接点接收事件。到目前为止,我得到的是: 使用托管(REF类)C++类实现这一点是不可能的,我使用的是正常的非托管类。 由于不能使用任何ATL宏,我需要在sink类中实现IUnknown抽象函数(AddRef、Release、QueryInterface等) 我可以检索接口的IConnectionPoin

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

  • 使用托管(REF类)C++类实现这一点是不可能的,我使用的是正常的非托管类。
  • 由于不能使用任何ATL宏,我需要在sink类中实现IUnknown抽象函数(AddRef、Release、QueryInterface等)
我可以检索接口的IConnectionPoint指针,但对advice()的调用返回E_NOTIMPL。这让我相信,我错过了在某处实现一些ATL基础功能,但我不确定从哪里开始


顺便说一下,我在网络上发现了一个关于在托管C++项目中使用COM的资源。我最接近的是这篇文章。有人对这个问题有什么好的看法吗?现在,我的大脑正在被绞刑。

< P>在您的托管C++应用程序中,使用“添加引用”选项添加对COM服务器的引用,这将为您的COM组件创建一个托管包装(程序集),您将能够在“托管C++代码”中使用它。COM组件中的事件应该可用.NET事件来提供,这些事件可以在托管C++中使用常规事件处理来处理。p>
从您的描述看来,您试图使用托管代码来管理托管C++应用程序中的COM组件,这使得事情变得复杂。混合托管代码和非托管代码应该有明确的界限,过多地跳入和跳出这些界限会使事情变得复杂,并会导致其他严重问题。因此,我建议您使用COM组件使用COM组件,C++只为COM组件创建托管包装。在托管C++应用程序中,

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

从您的描述看来,您试图使用托管代码来管理托管C++应用程序中的COM组件,这使得事情变得复杂。混合管理和非托管代码应该有明确的界限,并且跳出太多的边界,会使事情复杂化,并导致其他严重问题。s、 因此,我建议您使用“托管代码”(c++)使用COM组件只有bu为COM组件创建托管包装器。

谢谢您的回复。您是对的,我在混合托管代码和非托管代码时遇到了很多麻烦。“添加引用”选项在哪里?您是否有此方法的文档链接?右击项目,您将看到添加引用。它将打开一个对话框,其中有一个“COM”选项卡,打开该选项卡,您将看到系统上所有已注册的COM组件。基本上,这只是Tlbimp.exe之上的IDE功能。这是用于为COM创建托管包装的工具。参考:谢谢你的回复。你是对的,我把托管代码和非托管代码混为一谈。“添加引用”选项位于何处?你有这种方法的文档链接吗?右键点击项目,你会看到添加参考。它将打开一个对话框,其中有一个“COM”选项卡,打开该选项卡,您将看到系统上所有已注册的COM组件。基本上,这只是Tlbimp.exe之上的IDE功能。这是用于为COM创建托管包装的工具。参考: