gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:32 24 4
gpt4 key购买 nike

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

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

  • 意识到使用托管(ref 类)c++ 类是不可能的,我正在使用普通的非托管类。
  • 无法使用任何 ATL 宏,我需要在接收器类中实现 IUnknown 抽象函数(AddRef、Release、QueryInterface 等)。

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

顺便说一句,我在网上发现很少有关于在托管 C++ 项目中使用 COM 的资源。我最接近的是this文章。有人对这个主题有任何好的阅读吗?此刻我的大脑正在崩溃。

最佳答案

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

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

关于c++ - 非托管 C++ COM 和托管 C++ .NET4 互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5878545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com