-
2020-05-27 10:07:46
代码如下:
//==================================================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目录下,程序崩溃了,但是你不知道是什么原因导致的!!!!!
-
Qt界面动态库被MFC对话框调用
2016-08-01 17:58:02简介:本人学习Qt一个星期了,利用Qt做的仿360界面,然后打包成动态库。 用C++的MFC对话框按钮调用Qt界面动态库,经测试成功。 -
VS2017编写MFC库以及使用Qt调用MFC库方法
2019-07-08 12:08:54若该文为原创文章,未经允许不得转载 原博主博客地址:... 目录 前言 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调用Qt使用MinGW编译的dll
2021-12-07 10:11:06最近因为项目需要,MFC调用Qt下使用MinGW编译的dll,从开始的调用基础函数,到后面调用Qt界面,到隔离Qt发布所需的dll到单独的目录,遇到了各种各样的问题,好在最终都顺利解决了,于是打算写一个专题讲述这个问题,...最近因为项目需要,MFC调用Qt下使用MinGW编译的dll,从开始的调用基础函数,到后面调用Qt界面,到隔离Qt发布所需的dll到单独的目录,遇到了各种各样的问题,好在最终都顺利解决了,于是打算写一个专题讲述这个问题,由浅入深,特此分享,所有的工程都会完整提供,也是作为纪念,防止将来忘记了(虽然有代码备忘就是了)。
首先,先从最基础,最简单的入手。
第一步,创建Qt编译dll的工程,除了图中的选项选择c++ Library其他一路默认,生成一个名为EasyDll的工程。
其中头文件和实现文件分别为,分别实现一个成员函数和一个静态成员函数测试。
//author:autumoon //联系QQ:4589968 //日期:2021-12-07 #ifndef EASYDLL_H #define EASYDLL_H #include "easyDll_global.h" class EASYDLL_EXPORT EasyDll { public: EasyDll(); int Add(int a, int b); static int AddStatic(int a, int b); }; #endif // EASYDLL_H
//author:autumoon //联系QQ:4589968 //日期:2021-12-07 #include "easydll.h" EasyDll::EasyDll() { } int EasyDll::Add(int a, int b) { return a + b; } int EasyDll::AddStatic(int a, int b) { return a + b; }
因为Qt工程才可以直接调用Qt的基于QObject的导出类,而MFC不行,所以需要使用
extern "C"
声明导出接口。
//author:autumoon //联系QQ:4589968 //日期:2021-12-07 #ifndef EXTERNCINTERFACE_H #define EXTERNCINTERFACE_H extern "C" { //初始化 __declspec(dllexport) int Add(int a, int b); //是否显示窗口 __declspec(dllexport) int AddStatic(int a, int b); } #endif // EXTERNCINTERFACE_H
实现:
//author:autumoon //联系QQ:4589968 //日期:2021-12-07 #include "ExternCInterface.h" #include "easydll.h" int Add(int a, int b) { EasyDll ed; return ed.Add(a , b); } int AddStatic(int a, int b) { return EasyDll::AddStatic(a, b); }
编译,生成easyDll.dll。
将easyDll.dll移动到单独的目录,使用windeployqt命令,提取依赖的dll,具体方法为,如图所示的命令,如果Qt的版本不同,则位置对应不同。
提示,可能不是qt的dll,这是因为我们的导出函数并没有使用Qt的组件,不管,但是这个步骤不能省略,尤其是以后复杂的dll导出的时候。
使用vs2015新建Win32控制台应用程序的easyDllLoader工程,注意因为dll是x64的,所以这里也需要更改为x64的。
编写测试代码,分别调用两个函数测试,关键是调用dll部分的代码。
//author:autumoon //联系QQ:4589968 //日期:2021-12-07 // easyDllLoader.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; int LoadQtAdd(int a, int b) { HMODULE mod = LoadLibrary(_T("easyDll.dll")); DWORD err = GetLastError(); int nSum = 0; if (mod) { typedef int(*Add)(int, int); Add add = (Add)GetProcAddress(mod, "Add"); nSum = add(a, b); FreeLibrary(mod); } return nSum; } int LoadQtAddStatic(int a, int b) { HMODULE mod = LoadLibrary(_T("easyDll.dll")); DWORD err = GetLastError(); int nSum = 0; if (mod) { typedef int(*Add)(int, int); Add add = (Add)GetProcAddress(mod, "AddStatic"); nSum = add(a, b); FreeLibrary(mod); } return nSum; } int main() { int a = 3, b = 2; cout << LoadQtAdd(a, b) << endl; cout << LoadQtAddStatic(a, b) << endl; getchar(); return 0; }
将easyDll放到easyDllLoader.exe同目录下,运行成功输出结果:
至此,最简单的MFC调用Qt下使用MinGW编译的dll就完成了!
由于本次调用并没有使用Qt的相关组件,所以非常简单,也基本不会遇到什么问题,但是一旦遇到需要调用Qt组件,问题就会变得复杂一些,后续继续更新。
完整代码下载:easyDll.rar - 蓝奏云文件大小:6.3 K|
https://autumoon.lanzoux.com/iztN7xc938f
-
Qt基于QLibrary调用MFC生成的dll范例
2022-02-28 15:56:20直接上源代码: //author:autumoon //联系QQ:4589968 //日期:2022-02-28 #ifndef HEARTBEATDLL_H #define HEARTBEATDLL_H int HeartBeatDll... } 主要是使用了QLibrary函数,基于C方式的导出即可。 测试界面: -
DLL中封装Qt窗口和控件,并使用MFC和Qt调用的示例。
2020-04-14 13:41:04将Qt控件和窗口封装进dll中,并使用MFC和Qt应用程序写出demo来调用该dll。将dll中封装的Qt窗口嵌入到主程序中,实现窗口渲染和消息传递。 -
MFC调用QT类库
2017-10-31 18:17:55MFC调用QT类库,实现QMessagebox弹出提示,在MFC中动态创建QT控件! -
关于dll动态库的一些想法,Qt与MFC的DLL调用
2020-09-17 19:52:55关于dll动态库的一些想法前言QT调用MFC的DLLMFC调用QT的DLL例子 前言 dll动态库是一种共享库,可以供执行程序在执行的过程中,动态的调用dll中的函数接口,而dll内部的实现则可以是任意形式。 从这点可以看出,理论... -
QT调用mfc dll和qt dll
2011-08-23 17:23:12该资源能够使用qt生成dll, 同时又mfc dll的例程,同时有使用qt调用 mfc 和qt dll的例程 。对于 学习使用qt dll很有帮助。 -
MFC程序调用Qt(DLL)界面显示
2017-10-30 13:41:14通过使用Qt开发框架,生成dLL动态库,供MFC执行程序调用。实现MFC调用Qt界面显示。 -
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 ...1.在qtwinmigrate中的qtdll中,只要使用main.cpp的如下代码... -
Qt调用动态库文件的使用方法.rar
2020-06-04 11:37:13该文件包含了Qt调用MFC的插件、调用DLL so文件的方式,具体的都以文档的形式罗列出来,文档中的例子全是亲自实践过了,完全可用。 -
MFC中LoadLibrary调用Qt动态库失败的原因
2021-06-23 09:47:06今天在不同的电脑用mfc使用LoadLibrary调用qt的动态库,在某些电脑成功,某些电脑又失败。开始以为是宽字符的原因。可以看到在UNICODE编码下,LoadLibrary实际上是LoadLibraryW。 于是改成 HMODULE hDll = ... -
VS2017 用MFC调用QT 带界面的动态库DLL
2019-10-07 20:36:32本文主要参考... 主要是平台不一样,记录下实现过程。 VS平台:VS2017 QT:5.11.2 ...目的:使用MFC 调用QT动态库。 使用到的辅助文件qtwinmigrate,可以在这个网址下载。https://github.com/qtpro... -
QT调用动态库,执行MFC窗口功能
2018-11-29 11:36:09QT和MFC使用的不同框架,提供不同的接口,以前MFC已经完善部分功能,且已封装为库,代码还多,不想全部用QT重写,于是想用QT调用动态库,执行MFC部分功能 1.导出函数 #pragma once #ifdef MyDll_EXPORTS #define... -
MFC调用QT编写的DLL动态库
2017-12-07 16:58:53MFC调用QT编写的动态库,如果QT dll里面用到了一些消息循环相关的接口,比如QTimer,QEventLoop等,会由于没有QAppAplication而导致这些调用出现异常,如果DLL里面没有界面显示的话,解决方法还是相对比较简单的。 -
找一个懂MFC和qt的,帮我把mfc动态库转成qt动态库,然后用我一个qt程序能调用就可以了
2021-07-16 16:17:41找一个懂MFC和qt的,帮我把mfc动态库转成qt动态库,然后用我一个qt程序能调用就可以了 这是一个带界面的动态库. 1 -
关于QT调用MFC动态库时传递中文字符乱码问题
2016-05-12 16:11:58MFC CString和QT QString都采用unicode编码 MFC中的char *采用GBK编码,QT中的char *采用UTF-8编码,这里关于字符的编码,有个规律就是和源码文件保存的编一致。 // QT中QString的Unicode编码转GBK编码... -
Qt和MFC的比较
2021-04-07 20:11:23在当今基于C++的图形界面开发领域,能与Qt相抗衡的只有MFC。MFC是微软公司的基础类库,自然得天独厚,比如开发深层次的Windows应用远超Qt,但Qt也有杀手锏,那就是跨平台。这两点大家一目了然,下面我们再来比较一下... -
QT和MFC的优缺点比较
2021-02-20 20:25:35文章目录Document/View model伪对象 vs 真对象创建界面Unicode...MFC或多或少使用了面向对象的方法包装了Win32的- API,正因如此,这些API有时是C++,有时是C,甚至是C和C++的混合体。 - Qt这个C++的图形库由Trollte -
QT调用MFC生成的动态链接库,功能为解决QT中打开文件QFileDialog时某些机器闪退的问题
2017-08-07 16:28:01QT调用MFC生成的动态DLL,非空洞练手而写的例程,而是工程中为解决QT中打开文件QFileDialog时某些机器闪退的问题,有想了解混合编程调DLL的同学和遇到使用QFileDialog时程序闪退问题的同学可借鉴 -
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来编译和链接的, -
Qt嵌入MFC界面
2020-10-13 17:34:45在VS下使用MFC调用动态连接库进行数据的采集,将MFC的界面进行打包后使用Qt调用,并MFC的界面嵌入到Qt中,实现应有功能。 操作过程 1、将MFC编译的exe即相关的动态链接库文件复制到Qt编译的工程目录下。 2、确定MFC... -
qt使用动态库(DLL)
2014-03-06 20:44:35本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。...由上可以看出动态库的lib和静态库的lib文件是不同的。 如果使用生成连接库的开发环境与使用连接库的 -
QT 调用 MFC 常规动态DLL mfc120ud.dll 崩溃
2016-05-26 16:50:29场景: QT 工程是GUI工程,实际工作中需要调用MFC 常规的动态库,遇到了启动就崩溃的问题,具体见截图。 问题截图: 通过以下配置,可以解决掉该问题: -
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、选择自己需要模块... -
QT动态库 & 静态库介绍及使用
2021-12-11 15:54:43文章目录动态链接库Dynamic Link VS 静态链接库 Static Link动态库调用方式 动态链接库Dynamic Link VS 静态链接库 Static Link https://zhuanlan.zhihu.com/p/71372182 ... 目标程序通常都不是独立个体,生成程序时都...