网站首页 > 编程文章 正文
创建DLL源文件
创建好后如图:
编写函数
DLL在QT中可以静态调用也可以动态调用,如果只采用静态调用的方法,那DLL的函数编写和普通程序没有什么差别。如果要使用动态调用的方法,那么函数必须是C函数!
C没有“类”的概念,因此像void sky::test() 这样的写法是错误的!
C函数的编写:
1、在.h头文件中:
//导出宏
#ifdef Q_OS_WIN
#define MY_EXPORT __declspec(dllexport) //Windows系统需要这个参数
#else
#define MY_EXPORT
#endif
//定义一个C函数
extern "C" MY_EXPORT int Cfun(int i); //导出函数必须使用 extern "C" MY_EXPORT 做前缀
注意:如上面代码所示, C导出函数必须使用:extern "C" MY_EXPORT 作为前缀!
2、.cpp文件:
//这里也必须使用 extern "C" MY_EXPORT 作为前缀
extern "C" MY_EXPORT int Cfun(int i){
return i;
}
这样,一个简单的C函数就写好了,编译即可产生dll文件。
需要注意的是:如果要让DLL文件在其它编程工具中调用, 变量类型不要使用QT专有类型,比如QString!
题外话,QString的处理速度比string要慢60%-70%
QT调用DLL的方法
一、静态调用
1、将dll源码目录中的两个.h文件拷贝到程序源码目录下,如图:
2、在.h头文件中include,如图:
3、拷贝DLL文件
如果DLL采用MSVC编译,将生成的.dll和.lib文件拷贝到程序目录下,如图:
当然,为了源码目录整洁,可以创建目录将它们放在下级目录中。
如果DLL文件是MinGW编译,只需拷贝DLL文件。
4、在.pro文件末尾添加一行:
LIBS += -L$PWD -lskyLib
其中,-L表示指定库路径,$PWD表示.pro文件所在路径,-l加载库文件。
如果程序使用MSVC编译器,还可以使用其专属方法,在.h头文件中添加:
#pragma comment(lib,"Z:\\test\\skyLib") //MSVC编译器专属方法,不推荐使用
并不推荐使用这种专属方法来加载DLL,如果使用了,那么还要将.dll和.lib文件拷贝到编译输出目录中,如图:
否则调试不了,会报程序异常结束,如图:
设置成功后,就可以使用DLL中的函数了。
5、使用DLL中的函数
C函数可以直接使用,如图:
普通函数,则需要创建类实例,如图:
二、动态调用
动态调用无须在.pro文件中设置LIBS,也不需要导入dll的头文件,但DLL的导出函数必须是C函数!C函数的编写方法如果忘了,可以翻上去再看一下
先来看一下C函数和普通函数的区别:
上图Cfun是C函数,其它是普通函数。普通函数名称像这样,是无法调用的!
动态调用方法:
1、在.h头文件中添加代码:
#include "QLibrary"
typedef int (*newCfun)(int i);
newCfun funtest; //用于存放DLL函数的指针
typedef这句代码中,第一个int是函数类型,要和导出函数中的类型一致,(*newCfun) 这个名称自取,和导出函数无关。(int i)对应导出函数中的参数,类型、数量需要一致。
2、.cpp文件中,写入代码:
QLibrary *lib = new QLibrary("Z:/mingw/skyLib.dll"); //加载DLL文件
if(lib->load()){
qDebug() <<"DLL加载成功";
funtest = (newCfun)lib->resolve("Cfun");//这里的两个newCfun 就是前面typedef定义的那个。而Cfun则是要调用的导出函数的名称,不能错!
if (funtest){
qDebug()<<"解析成功";
//解析成功后,就可以使用funtest()来调用Cfun函数了:
qDebug()<<funtest(123);
}
}
我把它写在了构造函数里,根据情况也可以写在其它地方
猜你喜欢
- 2024-10-14 「Qt入门第31篇」 网络(一)Qt网络编程简介
- 2024-10-14 qt 做手机android的串口通讯 qt下串口通信
- 2024-10-14 Qt 读写txt文本文件(qt读入文件)
- 2024-10-14 Qt 信号槽连接不成功问题原因汇总
- 2024-10-14 QML 性能优化建议(一)(qml例程)
- 2024-10-14 C++ QT中文件的读写操作(UI界面)(qt怎么读取文件内容)
- 2024-10-14 Qt 中的智能指针(qt 函数指针)
- 2024-10-14 Qt如何读取和写入配置文件的数据(qt 读写配置文件)
- 2024-10-14 Qt pro文件中的常用宏说明(qt pro 自定义宏)
- 2024-10-14 Qt应用程序主窗口:拖放操作与打印文档
你 发表评论:
欢迎- 06-24一个老爸画了超级有爱的365幅画 | 父亲节献礼
- 06-24产品小白看魏则西事件——用产品思维审视百度推广
- 06-24某教程学习笔记(一):13、脚本木马原理
- 06-24十大常见web漏洞——命令执行漏洞
- 06-24初涉内网,提权那些事(内网渗透提权)
- 06-24黑客命令第16集:47种最常见的**网站方法2/2
- 06-24铭说 | 一句话木马的多种变形方式
- 06-24Java隐藏的10倍效率技巧!90%程序员不知道的魔法方法(附代码)
- 最近发表
- 标签列表
-
- spire.doc (70)
- instanceclient (62)
- solidworks (78)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)