先讲一下对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在其它语言中或者平台中调用方法各不相同,可以自行在网上上搜索进行调用,这里介绍的是其中一种动态库生成与调用,后面的教程会出来没用使用到的其它方式。