QLibrary动态加载DLL

阅读数:22 评论数:0

跳转到新版页面

分类

C/C++

正文

一、概述

使用 QLibrary 动态加载 DLL 时,不需要在项目中链接对应的 .lib 文件。这是因为 QLibrary 直接在运行时加载 DLL 并解析函数地址,而不依赖于编译时的符号解析。

通常不需要在 CMakeLists.txt 中进行特殊配置,因为 DLL 是在运行时动态加载的,而不是在编译时链接的。

二、dll文件的位置

1、应用程序目录

将 DLL 放在与可执行文件同一目录下。这是最常见和方便的方式,因为应用程序默认会在其自身目录中查找 DLL。

2、系统目录

在 Windows 上,可以将 DLL 放在系统目录(如 C:\Windows\System32)。在 Linux 上,可以放在 /usr/lib/usr/local/lib

3、指定路径

在代码中指定 DLL 的绝对路径或相对路径。

QLibrary library("C:/path/to/your/dll/example.dll");

4、环境变量

设置环境变量(如 PATH),以便系统在这些路径中查找 DLL。

三、使用步骤

1、包含头文件

首先,确保包含 QLibrary 的头文件:

#include <QLibrary>

2、加载dll

QLibrary library("yourdll"); // 不需要 .dll 扩展名
if (!library.load()) {
    qDebug() << "Failed to load DLL:" << library.errorString();
    return;
}

3、获取函数指针

使用 resolve 方法获取函数指针。你需要知道函数的签名,并将其转换为函数指针类型。

typedef int (*FunctionType)(int, int); // 假设函数签名为 int func(int, int)

FunctionType func = (FunctionType)library.resolve("functionName");
if (!func) {
    qDebug() << "Failed to resolve function:" << library.errorString();
    return;
}

4、调用函数

一旦你获得了函数指针,就可以像普通函数一样调用它。

int result = func(5, 10);
qDebug() << "Result:" << result;

5、卸载dll

在不再需要使用 DLL 时,可以显式卸载它:

library.unload();

6、完整示例

在使用 QLibrary 动态加载 DLL 时,通常只需要在程序启动或需要使用这些函数时加载一次 DLL,并解析一次函数指针。之后,你可以多次调用这些函数,而不需要重复加载和解析。

#include <QLibrary>
#include <QDebug>

typedef int (*FunctionType)(int, int);

class MyLibrary {
public:
    MyLibrary() : library("yourdll"), func(nullptr) {
        if (library.load()) {
            func = (FunctionType)library.resolve("functionName");
            if (!func) {
                qDebug() << "Failed to resolve function:" << library.errorString();
            }
        } else {
            qDebug() << "Failed to load DLL:" << library.errorString();
        }
    }

    int callFunction(int a, int b) {
        if (func) {
            return func(a, b);
        } else {
            qDebug() << "Function not loaded";
            return -1; // 或其他错误处理
        }
    }

private:
    QLibrary library;
    FunctionType func;
};

// 使用示例
int main() {
    MyLibrary myLib;
    int result = myLib.callFunction(5, 10);
    qDebug() << "Result:" << result;

    return 0;
}

 

 




相关推荐

一、概述 QT是一个跨平台的C++库,主要用来开发图形界面(GUI)程序,它支持多种操作系统 ,如Windows、Linux、Android、ios、gnx、vxworks。 官网:https://w

一、预览 通过窗体-预览 或者 ctrl+R打开预览。 可以使用不同的内置风格、新式表、设备皮肤进行预览。在应用程序可以通过调用QApplication::setStyleSheet()来加载样式表实

代码编辑: Ctrl + Space: 激活代码补全 Ctrl + /: 注释/取消注释当前行或选定代码 Ctrl + I: 自动缩进选定代码 Ctrl + Shift + U: 转换选定文本为大写

在 Qt 中,输出变量值通常是用于调试目的,你可以使用多种方法来打印或显示变量的值。以下是一些常见的方法: 1、使用 qDebug: qDebug 是 Qt 中用于输出调试信息的宏。它可以将输出发送到

在 Qt 中全局加载一个 TTF 字体文件并使用它,你可以在程序初始化时期,比如在 main 函数中加载字体。以下是加载全局字体的步骤: 加载字体文件:使用 QFontDatabase::addAp

一、对于窗口 (QMainWindow, QDialog, 等): 1、move() 方法: 使用 move() 方法可以将窗口移动到屏幕上的指定位置。 QMainWindow *window = n

Qt框架中使用new关键字创建的对象通常需要手动释放,但是Qt提供了一种父子关系机制,可以自动管理对象的内存。当你使用new创建一个对象并将其分配给一个父QObject时,这个对象将会在父对象被销毁时

在Qt中,border-radius 在样式表中不会对顶层窗口生效。顶层窗口是指没有父窗口的窗口,通常是您的应用程序的主窗口或者独立的弹出窗口。由于安全性和平台兼容性的原因,很多样式表中的属性在顶层窗

在Qt中,connect函数用于连接信号和槽。从Qt 5开始,你可以使用C++11的lambda表达式作为槽函数,这样可以使你的代码更加简洁,尤其是当你想要对信号进行一些简单的处理时,而不想去定义一个

1. 定义全局常量 全局常量可以在一个头文件中使用 const 关键字或 #define 预处理器来定义: // constants.h #ifndef CONSTANTS_H #define CO