热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

前言(这部分与技术基本无关,可略过)为了图省事,从学习OCC到现在一直在它提供的MFC架构下做功能,但最近项目

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

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

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

        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博客_无法解析的外部符号

 


推荐阅读
author-avatar
搞笑宠物图片
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有