gpt4 book ai didi

c# - 没有CLR的MFC中如何访问Winform ActiveX控件

转载 作者:行者123 更新时间:2023-11-30 02:42:48 25 4
gpt4 key购买 nike

我的项目由四个项目组成

  1. 通过互操作公开 COM 接口(interface)的 C# DLL
  2. 一个 WPF 控件,其中包含 1 中公开类的实例
  3. 使用 ElementHost 在 2 中托管 WPF 控件的 Winform ActiveX
  4. 使用 3 中的控件的 MFC 对话框应用程序

Winform ActiveX (3) 通过 2 中的函数公开 1 中的类实例。我希望通过 ActiveX 从 MFC 对话框应用程序访问此类实例。我环顾四周,发现您可以使用 CWinFormControl 来做到这一点。但是,我不能随意使用/clr 重新编译 MFC 应用程序。因此我不能使用 CWinFormControl。

我可以从 MFC 应用程序通过 COM 访问 1 中的类并运行所有函数等,但是该类是一个不同的实例,因为 DLL 加载到它自己的空间中。

ActiveX 运行良好,可以很好地显示所有 WPF 数据。

所以问题是如何在不使用 CWinFormControl 的情况下从 MFC 应用程序中获取指向 ActiveX 控件的指针?

我已尝试从 ActiveX 导入 TLB 并尝试在类向导中为其创建“变量”,但它报告 TLB 不可用。我也尝试过通过手动创建变量直接创建 DDX 条目,但 DDX 不允许指针。

有什么想法吗?

最佳答案

问题基本上是尝试访问 MFC 中的 Winform ActiveX 控件,而无需使用 clr 或托管 C++。

对于任何对此问题的答案感兴趣的人,这里是我如何解决它的。首先,您必须动态创建 ActiveX 并将其放置在您自己的位置。

在您的 MFC 对话框标题中添加一个 CWnd

   CWnd m_MyActiveX;

在您的 MFC Cpp 中动态创建控件

   m_MyActiveX.CreateControl("MyActiveX.ProgId","",WS_VISIBLE,prect,this,5000);

注意:您可以在 Winform ActiveX 属性中找到 progid

[ProgId("MyActiveX.ProgId")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]

下一步为您需要的 COM 对象获取 IUnknown 和 QueryInterface

IOleObjectPtr pOleObj(m_MyActiveX.GetControlUnknown ());
if (pOleObj != NULL)
{
MyCOMObject::IWpfHostPtr host;
pOleObj.QueryInterface(__uuidof(MyCOMObject::IWpfHostPtr),&host);

MyCOMWPFControl::IWpfControl wpf;
host->GetWpfControl ( &wpf );

MyInternalCOMObject::ICoolObject internal;
wpf->GetInternalObject ( &internal );

internal->AndAPartridgeInaPearTree ();
}

注意:实际的 Winform ActiveX 必须派生自某些已知的接口(interface)

public partial class WpfHost : UserControl, IWpfHost 

使用此技术,您可以在旧版 MFC 应用程序上成功托管 WPF 控件,并通过 COM 与它们通信,而无需求助于托管 C++

关于c# - 没有CLR的MFC中如何访问Winform ActiveX控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746790/

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