如何在MFC中访问Winform ActiveX控件没有CLR
我的项目由四个项目组成
- 通过Interop暴露COM接口的C#DLL
- WPF控件,包含1中公开类的实例
- 一个Winform ActiveX,它使用ElementHost在2中托管WPF控件
- 使用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 ++