WPF调用MFC DLL总结

来源:互联网 发布:mac sdk路径 编辑:程序博客网 时间:2024/06/05 02:59

        就这段时间处理在wpf下调用MFC DLL所遇到的种种问题,与大家一起分享一下,与大家一起进步。

      准备条件:

    我手中有一个mfc dll文件,该文件相当于一个图形界面控件。它有一个导出函数,该导出函数需要一个父句柄(hwndParent)的输入。同时,返回该控件的对象指针。

       同时,我手中还有关于这个控件的一些纯虚头文件,以及继承子类的一些实现。

       第一次尝试:

      之前已有听说,wpf下是不能使用mfc dll的,wpf中不存在句柄的概念。但是,工作上要求,必须得测试一下,不行得给出确切的不行的原因。

        首先,要说明一下的是wpf是有个主窗口父句柄的。可以用IntPtr handle = new WindowInteropHelper(this).Handle;方法得到。

        刚开始时,我是将那些关于控件类的纯虚头文件全部转换成wpf的类文件。但是,发现一个问题,wpf的抽象类是不允许声明抽象类的指针类型的。这样,我调用dll导出函数的返回值就无法保存下来。更不用说调用其中的一些方法了。

        而且这样做的另外一个问题是,很有可能MFC的类模型,与wpf不相同,如果是这样的话,那么类中对应成员函数的内存指针也有可能不同,那么我调用wpf中类成员方法,跟调用mfc类成员方法肯定是不一样的。所以得以验证这种方法是不可行的。

       第二次尝试:

      就在这个时候,我想到让dll的创建者,给我再度封装,只提供给我接口,而不需要我再去做调用类成员的方法。最后,dll创建者不愿意去做这项工作。而自己把这项工作交付给了我。让我自己再封装一层dll。说实话,我推荐不要像我这样做。因为几个dll,最后自己都会搞糊涂了。到底哪个dll是什么时候生成,怎么个路径关系,不过这里我将这几个工程全部都放在了一个工程中,然后将所有的输出路径都改为同一个路径。

       这样封装之后,操作起来基本上就无大碍了,但是却一直会出现一个异常,或系统崩溃的问题。

       经过调试过程,在dll中输出一个AfxMessageBox(“test”);最后测试得知,原来是AfxGetResourceHandle();这句有问题。(这里得说明的是wpf与mfc dll是不支持调试调用的)。上网查过资料才知道,原来该函数,所执行获取的是当前进程的信息,自然跟之前的dll没有关系,而实际上我是想获取dll的相关信息。这样一来,就自然会出现问题了。于是将此处一改发现问题居然解决了。

       wpf下用IntPtr类型给mfc传递句柄HWND,mfc返回的句柄用IntPtr类型接受。如此便可以实现MFC的界面在WPF上显示了。

       另外两种做法:

      在我翻书的过程中,我发现了wpf实际上提供有调用win32的基类hwndhost。

        通过重载hwndhost,相当于创建了一个win32平台的控件在wpf下的实现。其中是需要重载BuildWindowCore、DestroyWindowCore函数。同时还可以重载一个消息进程。将wpf的消息传递到win32控件上。

        这种方法与我第二次尝试的操作差不多,就不用多说了。

      

        另外一种方法:是我一个同事测试出来的,他讲mfc的dll制作成一个exe。然后将这个exe添加到了wpf界面中,实质上是运行了两个进程。他只用了两天就想出这种解决方法,实在是人才啊,这里赞一个。