博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT使用MFC编译的库
阅读量:4178 次
发布时间:2019-05-26

本文共 2052 字,大约阅读时间需要 6 分钟。

假定读者已有知识点

1、静态库 

2、动态库 

3、函数编译名称

4、MFC动态链接库和静态链接库的区别

5、extern "C"的作用

6、__stdcall和__cdecl调用区别

如果有不明白的,请移步另外一位作者文章或者自行百度

 

笔者阐述的知识点:

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 __cplusplusextern "C"{#endifvoid 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 
#include
#include
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目录下,程序崩溃了,但是你不知道是什么原因导致的!!!!!

 

 

转载地址:http://pkmai.baihongyu.com/

你可能感兴趣的文章
质量好的自行车品牌有哪些辐轮王土拨鼠全球顶级自行车品牌排行榜
查看>>
htmlunit爬取js异步加载后的页面
查看>>
修改Linux系统locale设置
查看>>
linux网络无法连接问题
查看>>
linux 查看ip
查看>>
记录go数据库操作的bug——max_prepared_stmt_count,附分析过程
查看>>
go中map与xml互转
查看>>
java进程占用CPU过高
查看>>
CSDN-markdown编辑器
查看>>
拷贝整个目录到另一台服务器并排除log目录
查看>>
拜托,面试别再问我跳表了!
查看>>
linux驱动实例
查看>>
android ArrayList<String> 转 String[]
查看>>
RecyclerView baseadapter
查看>>
Android中应用程序如何获得系统签名权限
查看>>
MPAndroidChart 动态更新
查看>>
Recycler表格(excelPanel)
查看>>
android一行代码实现沉浸式布局效果
查看>>
json, recyclerView问题
查看>>
cmake处理多源文件目录的方法
查看>>