-
2020-09-17 19:52:55
关于dll动态库的一些想法
前言
dll动态库是一种共享库,可以供执行程序在执行的过程中,动态的调用dll中的函数接口,而dll内部的实现则可以是任意形式。
从这点可以看出,理论上来说,只要是C、C++编写的动态库,都可以相互调用,比如Qt执行程序调用MFC开发的DLL,或者MFC调用Qt开发的DLL。
需要注意的是,MFC和QT的框架不一样,需要做一些处理。QT调用MFC的DLL
在qt中调用MFC的动态库,不需要起单独的消息循环,直接隐式或显式的将dll加载进来进行使用,需要注意的是在export的时候,最好不要export自定义的类,最好使用extern c导出成函数形式,供QT调用。
MFC调用QT的DLL
QT的界面要显示,必然要启动一个消息机制,因此export的时候,导出的接口内部必须要起一个事件循环。
例子
后续补充。
更多相关内容 -
QT显式调用MFC动态库(DLL)方法(学习记录)
2020-05-27 10:07:46//==================================================MFC================================================== void ShowTest() { AFX_MANAGE_STATE(AfxGetStaticModuleState());////需要加上.不然调用带界面的...代码如下:
//==================================================MFC================================================== void ShowTest() { AFX_MANAGE_STATE(AfxGetStaticModuleState());需要加上.不然调用带界面的MFC_DLL的话界面不会显示. qTestDll dlg; dlg.DoModal();//界面调用 } //==================================================QT================================================== //调用MFC_DLL void qMfcTest::on_pushButton_clicked() { QLibrary lib("TEST_DLL_QT.dll");//MFC动态库名称(与.exe程序放同一级目录下) if(lib.load()) { QMessageBox::information(this, "提示", "加载成功..."); typedef void (*TestInterfaceFunType)(); TestInterfaceFunType TestInterfaceFun = (TestInterfaceFunType)lib.resolve("ShowTest");//"ShowTest"为MFC_DLL接口函数 TestInterfaceFun();//调用该接口函数 } else { QMessageBox::information(this, "提示", "加载失败..."); QMessageBox::information(this,"bad",lib.errorString());//弹出错误原因 return; } }
讲一讲学习过程遇到的几个问题:
1. 提示加载失败,错误消息为找不到该动态库.
解决:动态库应该放在.exe同级目录下.
2. 提示加载失败,错误消息为一串错误代码.
原因:QT编译为64位,MFC_DLL位32位.
解决:把QT程序改为32位编译.
3. 调用带界面的MFC_DLL,界面不显示.
解决:调用界面前加上AFX_MANAGE_STATE(AfxGetStaticModuleState();
-
QT使用MFC编译的库
2021-03-27 16:59:01假定读者已有知识点 ...2、动态库 3、函数编译名称 4、MFC动态链接库和静态链接库的区别 5、extern "C"的作用 6、__stdcall和__cdecl调用区别 如果有不明白的,请移步另外一位作者文章或者自行百度 ...假定读者已有知识点
1、静态库
2、动态库
3、函数编译名称
4、MFC动态链接库和静态链接库的区别
5、extern "C"的作用
6、__stdcall和__cdecl调用区别
如果有不明白的,请移步另外一位作者文章或者自行百度
https://blog.csdn.net/dongchongyang/article/details/52926310?spm=1001.2014.3001.5506
笔者阐述的知识点:
1、首先跨编译器库的调用,静态库是无法实现的,因为规则不一样!如果有能实现的大神,请博客留言给我。
2、只能用动态库的方式
1)动态库导出类是不可行的,原因是编译规则不一样,类中的函数名称无法被另外一个编译器识别
2)动态库只能导出纯C接口的函数!为什么不导出c++函数接口,也是因为编译名称不一样的原因
下面开始讲如何MFC创建动态库给QT使用
1、MFC创建动态库(笔者用的是VS2012)
2、添加需要导出的函数头文件和cpp文件
Fish.h
#pragma once // 为了让QT也能使用这个动态库,必须2个下划线! #ifdef _USRDLL #define FUNCTION_DLL_API __declspec(dllexport) #else #define FUNCTION_DLL_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif void FUNCTION_DLL_API Swim(void); #ifdef __cplusplus } #endif
Fish.cpp
#include "stdafx.h" #include "Fish.h" void Swim(void) { CString str = TEXT("88Fish swim"); //::MessageBox(NULL, TEXT("Fish swim"), TEXT("Win32Lib"), MB_OK); AfxMessageBox(str); }
3、生成动态库,把生成的动态库拷贝到Qt工程调试目录下
4、qt工程调用MFC动态库的代码
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QLibrary> #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { QString qexeFullPath = QCoreApplication::applicationDirPath() + "/FunctionDll.dll"; QLibrary lib(qexeFullPath); if (!lib.load()) { QMessageBox::warning(this, "Test", "找不到动态库"); return; } typedef void (*SWimFunction)(void); SWimFunction Swim=(SWimFunction)lib.resolve("Swim"); if (Swim == nullptr) { QMessageBox::warning(this, "Test", "找不到动态库中Swim函数"); } else { Swim(); } lib.unload(); }
运行结果如下:
5、另外一种调用方法,但是笔者不推荐
同样把生成的动态库拷贝到Qt工程调试目录下 ,并且也拷贝一份和fish文件一起到Qt工程目录下
pro文件中加
LIBS += $$PWD/FunctionDll.dll
调用过程,同样可以达到上面的效果
#include "mainwindow.h" #include "ui_mainwindow.h" #include "Fish.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { Swim(); }
但是如果dll文件没在exe目录下,程序崩溃了,但是你不知道是什么原因导致的!!!!!
-
VS2017编写MFC库以及使用Qt调用MFC库方法
2019-07-08 12:08:54若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 ... 目录 前言 Demo 使用VS7建立MFC动态链接库 ...前提:需要安装VS中的MFC环境 ...建立MFC动态链接库 ...动态库所需...若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/95052025
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
其他(编程相关)(点击传送门)
《项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端》
《Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法》
《关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法》
《关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法》
《关于 C#调用c库,将C#的byte[]传入C库的方法和将C库的char*向上传入C#的回调函数byte[] 的方法》
前言
一些控件MFC操作是非常合适的,先用MFC开发成dll,然后使用Qt调用。
Demo
下载地址:https://download.csdn.net/download/qq21497936/11295694
使用VS7建立MFC动态链接库
前提:需要安装VS中的MFC环境
(注意:已安装可以忽略该步。)
进入VS的检查更新:
添加配置安装:
安装中:
等待安装完成:
建立MFC动态链接库
编写测试函数
动态库所需要的头文件、编译库lib和运行库dll
(注意:此方式,在QtCreator中失败)
使用QtCreator调用MFC动态连接库
脚本
将dll拷贝到工程目录,开发过程中,为方便调试,使用脚本:
请参照
《Qt实用技巧:win将ffmpeg、opengl、osg等各种库封装成qt模块,运行需要dll,增加自动拷贝运行库到exe目录执行脚本》:
https://blog.csdn.net/qq21497936/article/details/93745527
代码
运行结果
关于Qt给MFC传递中文的问题
MFC CString和QT QString都采用unicode编码;而MFC中的char *采用GBK编码,QT中的char *采用UTF-8编码,这里关于字符的编码,有个规律就是和源码文件保存的编一致。
所以Qt给MFC传递char*时,需要进行编码转换,如下:
bool OptPptManager::openFile(QString fullPath) { bool ret = true; // MFC与QT对char *的编码不同 QTextCodec * pCodec = QTextCodec::codecForName("GBK"); QByteArray data = pCodec->fromUnicode(fullPath); char * p = data.data(); if(0 != _pOpenPpt(p)) { ret = false; } return ret; }
入坑
入坑一:用包含头文件、lib和dll的方式,出现头文件错误
原因:
MFC到处的dll的问文件中,将头文件包含到qtcreator的qt工程中,无法识别,导致语法错误。
解决方法:
使用QLibrary显式调用。
入坑二:抽取函数失败
原因:
定义MFC库的时候没有在.def文件中声明
解决方法:
入坑三:传递中文的ppt路径挂掉(2019年7月10日补充)
原因:
MFC与Qt对字符的编码不同。
解决方法:
补充
当前测试AFX_MANAGE_STATE(AfxGetStaticModuleState())区别
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/95052025 -
MFC中LoadLibrary调用Qt动态库失败的原因
2021-06-23 09:47:06今天在不同的电脑用mfc使用LoadLibrary调用qt的动态库,在某些电脑成功,某些电脑又失败。开始以为是宽字符的原因。可以看到在UNICODE编码下,LoadLibrary实际上是LoadLibraryW。 于是改成 HMODULE hDll = ... -
MFC调用QT库
2019-08-08 17:11:14首先说下版本:VS2013+qt-opensource-windows-x86-msvc2013-5.7.0.exe 插件:VS:VA_X_Setup2073.exe QT:qt-vs-addin-1.2.5.exe (使用qtwinmigrate实现) 下载地址:qt-solutions.rar 1.在qtwinmigrate中的qt... -
MFC调用QT编写的DLL动态库
2017-12-07 16:58:53MFC调用QT编写的动态库,如果QT dll里面用到了一些消息循环相关的接口,比如QTimer,QEventLoop等,会由于没有QAppAplication而导致这些调用出现异常,如果DLL里面没有界面显示的话,解决方法还是相对比较简单的。 -
VS2017 用MFC调用QT 带界面的动态库DLL
2019-10-07 20:36:32本文主要参考... 主要是平台不一样,记录下实现过程。 VS平台:VS2017 QT:5.11.2 ...目的:使用MFC 调用QT动态库。 使用到的辅助文件qtwinmigrate,可以在这个网址下载。https://github.com/qtpro... -
QT封装动态库VC调用, 动态库发送消息给VC窗口
2022-04-11 15:59:33一、使用QT生成动态库。 1、使用QT新建工程,步骤New Project-->>Library-->>C++库。 2、给项目取名test21, 选择 “共享库”。 3、选择“Desktop Qt 5.9.1 MSVC2013 64bit”。 4、选择自己需要模块... -
VS-QT编译的动态库DLL,供MFC调用,需要添加的代码
2021-02-25 17:06:27网上下载qmfcapp.h,qwinwidget.h头文件 #include "qtwinmigrate\qmfcapp.h" #include "qtwinmigrate\qwinwidget.h" BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ ) ... -
QT调用MFCDLL
2016-12-16 16:04:48方式一:隐式调用 int nSum = ...在.pro文件中添加lib库路径和文件 LIBS+= -L../***/***/***/lib -l*** -L后面跟的是lib库路径 -l后面跟的是lib文件名,不要后缀.lib 因为库函数是以C来编译和链接的, -
MFC动态调用2种不同的QT DLL库
2020-08-02 10:07:50MFC中写法: 1、调用DLL接口类 ,下列代码不是完整的,但是功能能满足 xxx.h HMODULE m_hDLL; // 加载DLL bool LoadDll(char* strDLLFileName); // 实例化接口 int CreateInstance(int argc, char *argv[]); ... -
Qt调用DLL动态库接口函数程序崩掉
2017-11-10 10:23:58工作中使用Qt开发,调用外部动态库.dll,在调用接口函数时总是运行之后崩掉,提示段错误!单步调试总有变量被意外改动,弄了两天在同事的帮助下解决! 方法如下:在定义接口函数指针时添加 _stdcall,它的缺陷是... -
qt使用动态库(DLL)
2014-03-06 20:44:35本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。...由上可以看出动态库的lib和静态库的lib文件是不同的。 如果使用生成连接库的开发环境与使用连接库的 -
QT界面动态库的跨平台调用
2018-10-17 17:37:45QT界面动态库的跨平台调用关于调用的说明调用过程生成需要被调用的包含QT界面dll生成平台生成过程MFC调用上述dllconsle调用上述dll 关于调用的说明 不要去管网上各种大神说的需要什么什么库,那是瞎折腾!!! 调用... -
VS2017将MFC框架封装为DLL植入Qt框架
2021-06-19 19:06:28为了图省事,从学习OCC到现在一直在它提供的MFC架构下做功能,但最近项目需要合并到Qt中,于是做了以下尝试: 1. -
QT创建动态库,可用于其他程序调用(无界面不需要事件循环)
2021-05-18 11:42:03问题:QT封装的动态库,不能够正常被win程序/MFC程序调用 问题的起因:因为工作需要写一个操作注册表的库。一位前辈之前有写过注册表的操作,大致是用MFC写的,然后在win7系统下操作注册表存在权限问题无法修改... -
Qt中的动态链接库编程
2018-10-13 14:49:451:Qt中的动态链接库编程 使用C++面向对象的类编写DLL是要注意很多细节的,主要是二进制(ABI)兼容问题。COM是一个很成功的例子,只要符合COM的规范,我们就能编写出很好的DLL来,然而COM是微软私生的,要想跨平台... -
qt/mfc总结
2016-12-27 09:37:52qt是C++的库 也包含有windows库 哪些类 实现哪种方法 qwidget:所有窗口的父基类 qdialog:只有关闭按钮 无最大最小化 qmainwondow:有菜单 工具 应用程序类:Qappliaction a(argc,argv); return a.exec(); ... -
Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
2020-09-25 22:10:14若该文为原创文章,未经允许不得转载 原博主博客地址:...各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实 -
qt添加静态库不能使用 QT链接静态库建立问题,怎么解决
2021-06-12 05:32:59使用Qt静态库为什么运行出错因为链接的是qt的动态库,在没有qt动态库的系统上肯定是运行不了的。 有两种方法, 一种是静态编译,但会让运行文件变大。 二种就是把动态库和程序一起打包出去,路径设置Qt 中如何使用动态库... -
实现MFC中调用Qt编写的DLL(带窗体)
2020-08-13 14:28:35一、首先新建一个Qt动态库工程(*.dll) 选择新建Libray=>C++ Libray项目 因为我需要带ui界面的dll,所以依赖库这里选择Widgets(这里默认的是core,后面在项目的.pro文件中可以通过 Qt += core widgets 来... -
Qt中的动态链接库编程(Q_DECL_IMPORT、Q_DECL_EXPORT)
2018-07-26 18:21:241:Qt中的动态链接库编程 使用C++面向对象的类编写DLL是要注意很多细节的,主要是二进制(ABI)兼容问题。COM是一个很成功的例子,只要符合COM的规范,我们就能编写出很好的DLL来,然而COM是微软私生的,要想跨... -
VS2017+QT DLL UI.zip
2019-10-07 21:17:52VS2017 用MFC调用QT 带界面的动态库DLL,VS2017 用MFC调用QT 带界面的动态库DLL -
DLL中封装Qt窗口给MFC或Qt应用程序调用,并将DLL中的窗口嵌入主程序中,实现与主程序交互和自身事件循环的...
2020-04-14 13:43:20近期接到的任务场景是需要在windows动态链接库(dll)中封装Qt的QWebEngine控件,调用该dll的主程序可能是win32或MFC程序,也可能是Qt程序本身。要求是在dll内部封装的QWebEngine显示在调用该dll的MFC或Qt程序界面中... -
qt 多文档 添加mfc 写的dll动态库程序问题,请各位大侠帮忙
2018-11-11 22:30:46QMainWindow *mainWindow = new QMainWindow; mainWindow->setCentralWidget(mdiArea); 下面就是调用mfc dll里面的内容了 ...这个dll mfc程序调用没有任何问题,现在想先用qt 包个皮肤,以后都改成qt 的 -
Qt 中动态链接库使用 <一>
2017-03-06 17:18:28本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建... -
使用QT+MSVC编写32/64位动态库dll的问题记录
2017-04-15 18:16:10前言这是继上一篇使用QT+MinGW编写动态库dll供VC或VB调用的一些问题记录。 先说下上篇的一个留疑,使用MSVC编译出来的库才有lib+dll两个文件,MinGW只有DLL。MinGW版的QT只有32位的,想要64位的只能用MSVC了。 ...