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

 


推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
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社区 版权所有