先讲一下对QT动态链接库的调用方法,主要包括:
1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法
2、显示链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)
①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;
②用GetProcAddress直接调用。
③用Qt的QPluginLoader类直接调用生成的DLL插件类对象
3、隐式链接DLL:也是采用Qt的Qlibrary方法
本节教程主要讲的是第1种,下面开始:
一、新建DLL项目,这里直接上图
后面的一直过,直接新建完成 ,最后建成的项目如图所示(我写的教程部分截图是我已经写好的项目)
二、studydll_global.h中的文件不用动,下面直接贴出testdll.h和testdll.cpp代码
#ifndef TESTDLL_H #define TESTDLL_H #include "studydll_global.h" class studydll_DLLSHARED_EXPORT testdll { public: testdll(); private: }; extern "C" studydll_DLLSHARED_EXPORT void helloWorld(); extern "C" studydll_DLLSHARED_EXPORT int add(int a,int b); #endif // TESTDLL_H
#include <iostream> #include "testdll.h" using namespace std; testdll::testdll() { } void helloWorld(){ cout << "hello world!"<<endl; } int add(int a , int b){ return a+b; }
写好代码后直接点击编译,如果没有错误dll文件就已经成功了,在我们选择的运行方式目录下:
三、使用:我在这里新建了一个控制台程序作为调用示例,还是直接上代码
#include <QCoreApplication> #include <iostream> #include <QLibrary> #include <QTextCodec> #include <QString> using namespace std; //定义函数指针 typedef int (*Fun)(int,int); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //设置编码 QLibrary mylib("studydll.dll"); int result; //判断是否正确加载了dll if(mylib.load()){ cout<<"动态链接库加载成功"<<endl; //调用外部函数ADD Fun add = (Fun)mylib.resolve("add"); //判断是否成功链接上add()函数 if(add){ cout<<"调用add函数成功"<<endl; //使用dll中的add函数 result = add(11,23); cout<<"通过dll中的add函数计算出的结果:11+23="<<result<<endl; }else{ cout<<"调用add函数失败"<<endl; } }else{ // 动态库加载失败 cout<<"动态库dll加载失败 error"<<endl; } return a.exec(); }
最后测试的结果
到这里就完成了,dll在其它语言中或者平台中调用方法各不相同,可以自行在网上上搜索进行调用,这里介绍的是其中一种动态库生成与调用,后面的教程会出来没用使用到的其它方式。
版权声明:
此文为本站源创文章[或由本站编辑从网络整理改编],
转载请备注出处:
[狂码一生]
https://www.sindsun.com/articles/16/98
[若此文确切存在侵权,请联系本站管理员进行删除!]
--THE END--