如何在MFC中访问Winform ActiveX控件没有CLR

我的项目由四个项目组成

  1. 通过Interop暴露COM接口的C#DLL
  2. WPF控件,包含1中公开类的实例
  3. 一个Winform ActiveX,它使用ElementHost在2中托管WPF控件
  4. 使用3的控件的MFC对话框应用程序

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

我可以通过COM从MFC应用程序访问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中动态创建Control

  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必须从某个已知接口派生

 public partial class WpfHost : UserControl, IWpfHost 

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