我的项目由四个项目组成
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不允许指针。
有什么想法吗?
答案 0 :(得分:3)
该问题基本上是尝试在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 ();
}
注意:Actual Winform ActiveX必须来自某个已知的接口
public partial class WpfHost : UserControl, IWpfHost
使用此技术,您可以在旧版MFC应用程序上成功托管WPF控件,并通过COM与它们进行通信,而无需使用托管C ++