VS2017将MFC框架封装为DLL植入Qt框架

 前言(这部分与技术基本无关,可略过)

        为了图省事,从学习OCC到现在一直在它提供的MFC架构下做功能,但最近项目需要合并到Qt中,于是做了以下尝试:

        1.直接将代码复制粘贴进Qt框架下,但MFC这个框架比较霸道,其头文件<atlXXX.h>等一旦调用就会与<windows.h>起冲突,并且将代码复一点点制粘贴来合并效率太低,故放弃。

        2.想将我的代码中与MFC相关的部分全部删去再合并,但最终发现OCC极其依赖CString这个变量类型,尝试将其转化为const char * 类型使用但一直没有成功,故放弃,有能力的网友可以尝试一下,我觉得是可行的。

        3.一开始导师和师兄建议,可将MFC打包起来再进行合并,这样省事高效,但我觉得打包为DLL或exe这部分自己从没接触过,一直没进行尝试,果然还是要多听听长辈的建议,不要怕接触新鲜东西呀!

正文

本文以通过OCC导入Brep模型为例

1.创建项目

打开VS2017->新建->Visual C++->Windows桌面->动态链接库(DLL)->定好名字、路径后点击确定

2.修整目录

创建好的目录如左图,framework.h中只引入了windows.h这一个头文件,但我要用atlstr.h,所以我就直接把framework.h删掉了,修改完目录结构如右图

                         

并且要把上面的Debug改为x64

3.配置项目属性

点击项目->属性,来把OCC库配置进来

配置属性->常规如下:

VC++目录如下:

链接器->输入如下:

4.编写预编译头文件

我把atlstr.h包含在这里,省的所有文件都要带一个

5.编写头文件

在头文件夹下新建头文件winDLL.h,并写入以下代码

这里关键点有:

1.不要include有MFC的头文件,比如atlstr.h等等,因为头文件后面我们是要添加进我们主项目中的,大项目是基于Qt的,有MFC会起冲突。换句话说,头文件里所有代码都不要有与MFC相关的,可以把MFC相关的一会放在CPP里,添加一个转化过程就好了

2.定义函数的前面一定要加上__declspec(dllexport),意为导出函数

6.编写CPP文件

在源文件目录下新建winDLL.cpp文件,并写入代码

这里就可以在头文件中引入任何东西,包括MFC,因为这部分后面生成DLL后是隐藏起来的(黑盒),主项目调用时只能看到.h文件中的内容,.cpp是看不到的。

如此就相当于从外面看我函数的输入为string和AIS_InteractiveContext这两个windows就提供的类型,但在函数内(黑盒)我用.c_str()将string转化为CString,再参数调用CString这种MFC提供的类型就没事。

总的来说就是,函数外面都用windows的,函数里面随便用!

此时点击生成并成功

7.植入.h/.dll/.lib文件

将DLL项目的.h文件和.lib文件复制到主项目的模块分区中,我是引入到了我这部分模块Model下,将.dll文件和主项目的.sln文件放在同一目录下

8.配置主项目属性

VC++目录配置如下:将lib库的路径(我这里是Model)添加进来

链接器->常规配置如下:将lib库的路径(我这里是Model)添加到附加库目录中

链接器->输入配置如下:将lib库的名称(我这里是winDLL.lib)添加到附加依赖项中

9.在主项目中编写代码

在occView.cpp(就是你的项目中要调用该动态库的cpp文件)中引入.h头文件

编写调用代码,我这里定义了点击事件函数importBrep,在函数中用Qt编写了手动选择文件目录代码,得到string类型的路径,再调用函数导入Brep文件(Qt的这个代码路径中不能有中文名)

10.最终效果演示

参考文献:

VS2017新建和使用DLL(动态链接库)的方法 - 灰信网(软件开发博客聚合) (freesion.com)

如果过程中出现了”无法解析的外部符号“这种报错,不要慌,下面这篇文章很有用

无法解析的外部符号的几种可能_mahong100的博客-CSDN博客_无法解析的外部符号

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值