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

时间:2014-11-04 23:08:23

标签: c# c++ wpf winforms mfc

我的项目由四个项目组成

  1. 通过Interop公开COM接口的C#DLL
  2. WPF控件,其中包含1
  3. 中公开的类的实例
  4. 使用ElementHost
  5. 在2中托管WPF控件的Winform ActiveX
  6. 使用Control from 3
  7. 的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不允许指针。

    有什么想法吗?

1 个答案:

答案 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 ++