调用演示:
1.使用win32 api方法动态加载dll并调用函数
HINSTANCE inst = NULL;//动态链接库的句柄
//动态加载dll
inst = LoadLibrary(_T("TestExport.dll"));
if (!inst)
{
QMessageBox::information(this,NULL,QStringLiteral("加载TestExport.dll失败"));
}
else {
//通过进程地址加载导出函数
export_func = (_EXPORT_FUNC)GetProcAddress(inst, "export_func");//加载进程中的export_func函数
if (!export_func)
{
QMessageBox::information(this,NULL,QStringLiteral("获取函数export_func地址失败"));
//释放库
FreeLibrary(inst);
}
else {
export_func();//根据地址调用导出函数
}
}
//释放库
FreeLibrary(inst);
2.使用QLibrary类加载dll,并调用函数
使用前先引用头文件: #include <QLibrary>
QLibrary exportLib("TestExport");//导出库,使用QLibrary加载时不用加后缀名
//加载导入库
if(!exportLib.load()){
QMessageBox::critical(this,NULL,QStringLiteral("使用QLibrary加载TextExport导出库失败"));
}else{
export_func = (_EXPORT_FUNC)exportLib.resolve("export_func");//取函数地址
if(!export_func){
QMessageBox::critical(this,NULL,QStringLiteral("调用TextExport导出库export_func函数失败"));
}else{
export_func();//调用导出库中的函数
exportLib.unload();//释放库
}
}
3.通过.pro文件来加载,并调用函数
# 指定加载路径,调试运行时加载项目当前路径下的libs目录中的TestExport.lib TestExportDef.lib
# 直接运行程序时,加载程序当前路径上的TestExport.lib TestExportDef.lib
LIBS +=-L$$PWD/libs -lTestExport -lTestExportDef
复制库定义头文件到当前工程并添加到工程
复制:
添加到工程:
选择要添加的文件:
添加成功:
调用库中的函数:
func2();
func3(QByteArray("Hello").data(),666);
ui文件中添加三个按钮与对按钮添加点击事件
事件处理代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <Windows.h>
#include <tchar.h>
#include <QLibrary>
#include "TestExportDef.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
HINSTANCE inst = NULL;//动态链接库的句柄
//动态加载dll
inst = LoadLibrary(_T("TestExport.dll"));
if (!inst)
{
QMessageBox::information(this,NULL,QStringLiteral("加载TestExport.dll失败"));
}
else {
//通过进程地址加载导出函数
export_func = (_EXPORT_FUNC)GetProcAddress(inst, "export_func");//加载进程中的export_func函数
if (!export_func)
{
QMessageBox::information(this,NULL,QStringLiteral("获取函数export_func地址失败"));
//释放库
FreeLibrary(inst);
}
else {
export_func();//根据地址调用导出函数
}
}
//释放库
FreeLibrary(inst);
}
void MainWindow::on_pushButton_2_clicked()
{
QLibrary exportLib("TestExport");//导出库,使用QLibrary加载时不用加后缀名
//加载导入库
if(!exportLib.load()){
QMessageBox::critical(this,NULL,QStringLiteral("使用QLibrary加载TextExport导出库失败"));
}else{
export_func = (_EXPORT_FUNC)exportLib.resolve("export_func");//取函数地址
if(!export_func){
QMessageBox::critical(this,NULL,QStringLiteral("调用TextExport导出库export_func函数失败"));
exportLib.unload();//释放库
}else{
export_func();//调用导出库中的函数
exportLib.unload();//释放库
}
}
}
void MainWindow::on_pushButton_3_clicked()
{
func2();
func3(QByteArray("Hello").data(),666);
}
导出库定义与实现:
#pragma once
#include "tchar.h"
int func1(const char *str, int x);//函数定义
void func2();//函数定义
int func3(char *str, int x);//函数定义
#include "windows.h"
#include "tchar.h"
#include "TestExportDef.h"
//函数实现
int func1(const char * str, int x)
{
MessageBox(0, str, _T("函数func1"), 0);
return x;
}
//函数实现
void func2()
{
MessageBox(0, _T("没有参数的函数"), _T("函数func2"), 0);
}
int func3(char * str, int x)
{
MessageBox(0, str, _T("函数func3"), 0);
return x;
}
导出声明