1 背景知识
九年前,PSE(化学工程,过程系统工程)硕士毕业,由于整个研究生期间均使用Matlab做课题研究,并有幸帮助老师带了2年的Matlab实验课程。毕业那阵,正如我这个课题组的师兄所说,在化工中我的计算机水平是最强的,在计算机中我的化工水平也是最强的。可企业不需要这样的人,便陷入了找工作的尴尬期。找份工作先干着吧,受当时一句话”真正的程序员用C++”的影响,选择了VC++,由于无人指导,大概那个时候认为VC++就是C++吧。
由于第一个月只干了二十几天,到手工资900多点,于是彻底从朋友圈中消失了。为了这个爱好,也只有坚持了。看了N本关于C++的书籍,特别是那边号称Windows编程圣经的MFC C++Windows程序设计。经过几年努力,也用MFC C++弄出个不大不小的系统。虽说小,也具备了串口通信、数据库操作、报表打印等功能。
目前开始使用Qt,总舍不得丢掉MFC,虽然明知道使用Qt调用VS 写的DLL纯属于只是一部分很小的需求。然后走过必留痕迹,就把其记录下来。主要原因如下:
- Qt只能使用MFC导出的标准接口,无法使用MFC导出的类;
- MFC能够使用MFC导出的类;
- Qt能够使用Qt导出的类。
对于企业级应用,MFC应用也好、Qt也罢,若需使用DLL或plugin,如果DLL或plugin不能导出类,那么将失去面向对象的强大功能。想使用面向对象的方法将各模块进行清洗划分,几乎是不可能的。
过去MFC界面框架比较火,现在Qt如日中天,说不定那天又出现的Xt什么之类的框架,若想代码具有较高的可移植性,业务逻辑层代码尽量做到:
- 使用标准的C++语法;
- 使用C++标准库;
- 尽量不用系统级接口,如Win32 API。
- 尽量使用C++提供的技术,如线程技术进行流程管理。
把握了以上原则,业务层代码才可以在跨平台、跨界面框架做到100%重用。废话不说了,步入正题。
2 MFC 工程
本文不讲述如何使用VS解决方案管理工程,本文仅给出工程非默认配置或需要注意的地方。如果对此不熟悉,请参考百度,或跳过该章节,直接阅览感兴趣的部分。
2.1 MFC DLL创建
头文件“MFC_DLL.h”中代码如下:
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the MFC_DLL_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// MFC_DLL_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef MFC_DLL_EXPORTS
#define MFC_DLL_API __declspec(dllexport)
#else
#define