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界面中,实质上是运行了两个进程。他只用了两天就想出这种解决方法,实在是人才啊,这里赞一个。
- WPF调用MFC DLL总结
- wpf中调用w32的mfc dll 对话框
- MFC调用WPF函数
- 在MFC下调用WPF控件的总结
- MFC 调用 DLL
- MFC 调用VB dll
- BCB 调用MFC DLL
- MFC调用libvlc.dll
- mfc调用dll
- MFC中DLL调用
- MFC中调用DLL
- MFC静态调用dll
- MFC调用dll文件
- C++调用WPF的dll
- MFC中调用WPF教程
- MFC中调用WPF教程
- MFC中调用WPF教程
- MFC中调用WPF教程
- Select For update语句浅析
- PostgreSQL Linux 下的配置
- 我写的一个求2个数之间的质数,结果打印出了非质数和共有几个质数
- 微博系统架构
- c++ coding style
- WPF调用MFC DLL总结
- [原创翻译][新手必看]在何时该用什么方式编译WinCE
- soap协议中的soap结构体
- 求集合S中两个元素的和为整数X
- 推荐系统应用研究:音乐电台
- 数据库访问优化法则详解之返回更少的数据
- 工作2年4个月零1天
- 高性能Web服务器设计
- ORACLE 11G Flashback Versions Query