关于用mfc(c++)调用wpf(C#)编写的dll,实现界面消息回调的方法。
这几天有一个小项目。使用wpf制作界面,其他实现由mfc实现,就想到一个方案能不能使用wpf编写dll供mfc调用创建界面然后消息处理由mfc来实现,也就是wpf只负责页面显示和发送界面消息,而其他所有事情都交给mfc实现。
经过一番折腾,确实可行。但在途中遇到两个问题花了一些时间。第一个问题是,环境配置问题。第二个问题是,如何实现消息回调。
本人使用的是vs2019。
首先解决第一个问题,答案如下:
首先配置mfc的环境,右击解决方案下的mfc项目-->属性,如图选择左侧<高级>,将<公共语言运行时支持>改成<公共语言运行时支持(/clr)>,将<MFC的使用>改成<在共享DLL中使用MFC>
然后,如图,将<代码生成>中的运行库改成<多线程调试DLL(/MDd)>
这样配置就完成了,然后再将你编写的dll放入当前项目文件夹,如果要调试运行,则需要将dll同时放入生成应用程序的文件夹。在需要使用dll的代码前使用 #using "XXXX.dll"。
对于第二个问题,比如我创建了一个名为MainWindow的窗口,里面包含一个Button,当它按下时我想由mfc的代码来处理这个消息,要如何编写代码呢,下面是一种解决方案:
1.wpf(C#)中的代码:
代码关键是定义一个delegate函数CallBack(),然后在MainWindow类中声明一个CallBack类型的变量,待mfc中赋值,然后在回调函数中直接调用这个声明的委托变量。(本人C#比较渣,表述如有问题请见谅)
2.mfc(C++)中的代码
看了wpf的代码,我们应该知道现在只要在mfc中实现一个CallBack()函数,然后传递给wpf的MainWindow类中的myCallBack变量,不过这里的细节是如何将mfc实现的CallBack()函数传入wpf呢,请看下面代码。
注意,C++创建C#对象需要使用gcnew而不是new。
这里使用CallBack创建一个MessageBox,经过测试,代码可以正常运行。
网友评论