我有一个ATL COM服务,可以通过Windows Forms Application .NET4应用程序连接到该服务,该服务大部分是用托管c++编写的。
我可以成功地检索到接口(interface)的指针(通过CoCreateInstance()),但是在尝试实现事件接收器时会遇到问题。我希望在应用程序中创建一个非托管的c++类,该类实现由COM服务器定义的接口(interface),并从ConnectionPoint接收事件。到目前为止,我得到的是:
我可以检索该接口(interface)的IConnectionPoint指针,但是对Advise()的调用返回E_NOTIMPL。这使我相信我错过了在某个地方实现一些ATL基本功能的方法,但是我不确定从哪里开始。
顺便说一句,我在网上发现的很少有关于在托管c++项目中使用COM的资源。我最接近的是this文章。有人对此主题有很好的阅读吗?此刻正在打乱我的大脑。
最佳答案
在托管C++应用程序中,使用“添加引用”选项添加对COM服务器的引用,这将为COM组件创建托管包装器(程序集),您可以在“托管c++代码”中使用它。 COM组件中的事件应作为.NET事件提供,可以使用托管C++中的常规事件处理来处理。
从您的描述看来,您似乎正在尝试使用非托管代码来使用托管C++应用程序中的COM组件,这使事情变得复杂。混合托管代码和非托管代码应该有明确的界限,并且过多地跳入和跳出这些界限将使事情变得复杂,并导致其他严重的问题。因此,我建议您仅通过为COM组件创建托管包装器来使用“托管代码”(c++)使用COM组件。
关于c++ - 非托管C++ COM和托管C++ .NET4互操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5878545/