0
点赞
收藏
分享

微信扫一扫

Qt5.12实战之在QWidget应用中调用动态链接库中的函数


调用演示:

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_#include

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_c++_02

 

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

复制库定义头文件到当前工程并添加到工程

复制: 

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_qt_03

添加到工程: 

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_加载_04

选择要添加的文件: 

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_加载_05

 

添加成功: 

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_c++_06

调用库中的函数:

func2();
 func3(QByteArray("Hello").data(),666);

 ui文件中添加三个按钮与对按钮添加点击事件

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_c++_07

事件处理代码:

#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);
}

 导出库定义与实现:

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_#include_08

 

#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;
}

导出声明

Qt5.12实战之在QWidget应用中调用动态链接库中的函数_c++_09

 

举报

相关推荐

0 条评论