Qt调用DLL方法一:使用Win32 API

h文件

  1. typedef bool (CALLBACK* SetKeyBoardHook)(HWND);

  2. HINSTANCE hDLL; // Handle to DLL

  3. SetKeyBoardHook lpfnDllFunc1; // Function pointer

cpp文件

  1. void MainWindow::test()

  2. {

  3. hDLL = LoadLibrary("dllhook");//"dllhook"为DLL的文件名

  4. if(hDLL != NULL)

  5. {

  6. qDebug() << "dllhook加载成功";

  7. //"SetKeyBoardHook"为动态库里实现的函数名称

  8. lpfnDllFunc1 = (SetKeyBoardHook)GetProcAddress(hDLL, "SetKeyBoardHook");

  9. if(lpfnDllFunc1 != NULL)

  10. {

  11. qDebug() << "SetKeyBoardHook加载成功";

  12. bool flag = lpfnDllFunc1((HWND)this->winId());

  13. if(flag)

  14. {

  15. qDebug() << "钩子设置成功";

  16. }

  17. }

  18. else

  19. {

  20. FreeLibrary(hDLL);

  21. return;

  22. }

  23. }

  24. }

显式链接到 DLL,应用程序必须:
1 调用 LoadLibrary(或相似的函 数)以加载DLL和获取模块句柄。
2 调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用DLL的函数,编译器不生成外部引用,故无需导入库链接(不需要lib文件)。
3 使用完 DLL后调用FreeLibrary。

需要说明的是,typedef bool (CALLBACK* SetKeyBoardHook)(HWND);是声明想要调用的函数指针,这个函数的参数必须和DLL里面的一样。SetKeyBoardHook是DLL里面“实际的函数名”,必须和头文件里面声明的一样,否则将会调用失败。使用需要加Windows.h头文件。Windows里的Qt是用Mingw GCC来编译,而Mingw GCC可以支持Win32的API。使用时并不需要包含DLL的头文件。编译时可能会报错error: cannot convert 'const char*' to 'LPCWSTR ^,只要在pro文件中添加DEFINES-= UNICODE即可。

Qt调用DLL方法二:使用Qt的API

对于调用DLL的方法,Qt原来本身就有相应的类来实现,用起来和Win32的步骤差不多
h文件

typedef bool ( *SetKeyBoardHook)(HWND); //定义函数指针

cpp文件

  1. void MainWindow::test()

  2. {

  3. QLibrary mylib("dllhook");

  4. if(mylib.load())

  5. {

  6. qDebug() << "dllhook加载成功";

  7. SetKeyBoardHook open = (SetKeyBoardHook)mylib.resolve("SetKeyBoardHook");

  8. if(open)

  9. {

  10. qDebug() << "SetKeyBoardHook加载成功";

  11. bool flag = open((HWND)this->winId());

  12. }

  13. }

  14. }

Qt调用DLL方法三:直接调用 DLL
VC的引用库文件为xxx.lib, GCC的为xxx.a, 通过比较两种库文件的格式,发现很相似。于是把xxx.dll,xxx.lib和xxx.h复制到Qt的project下,直接把xxx.lib改为xxx.a, 根据Qt的库名字的格式, 在xxx.a的前面加上lib, 即为libxxx.a。

再在Qt的.pro文 件中最后面加上

LIBS += -L. –lxxx //增加当前目录下的libxxx.a

在Qt的源文件中加上

#include “xxx.h”

现在就可以直接调用xxx.h中的函数了。

// xxx.h

#ifndef XXX_H

#define XXX_H

WINAPI int xxx_func(void);

#endif

// main.cpp

#include “xxxh”

#include

#include

int main(int argc, char *argv[])
{

QApplication a(argc, argv);
QLabel label1(”label-1″); //显示打印信息,将就着用了。。。
if(xxx_func()) //“xxx_func”为DLL包 含的实际函数名,必须实际存在
{
label1.setText(”Run DLL success!…”);

}
label1.show();
return a.exec();
}

总结: 类似于调用DLL的交叉编程使用的场合很多,还可以用Qt生成DLL,给其它工具调用。说到底,VC和Qt等本质上都是一样的,只是提供了不同的C++库。

QT 调用 DLL 的三种方法相关推荐

  1. C++/CLI Winform中调用DLL的三种方法

    一,传统的LoadLibrary 二,#pragma comment(lib,""),需要lib文件 三,dllImport 一比较适合调用自己的dll的api,二比较适合调用系统 ...

  2. C#调用DLL的几种方法

    c#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素 ...

  3. php前台调用后台方法,JavaScript_JavaScript调用后台的三种方法实例,方法一:直接使用%=%调 - phpStudy...

    JavaScript调用后台的三种方法实例 方法一:直接使用调用 前台JS: var methodStr = ""; alert(methodStr); 后头方法: public ...

  4. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  5. zpl java_JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)...

    JAVA调用DLL的两种方法 (2008-03-05 17:24:48) 标签: 问题描述: 方法一,使用JNI: public class TestNative { private native s ...

  6. 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】

    C#中dll调用方法 一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...

  7. python cmd命令大全-详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  8. 详解python运行三种方式_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  9. Qt工作笔记-第三种方法在QGraphics上写文本

    前面的两种方法: QGraphicsSimpleTextIte和QGraphicsTextItem 如下: https://blog.csdn.net/qq78442761/article/detai ...

最新文章

  1. 010——VUE中使用lodash库减少watch对后台请求的压力
  2. Java设计模式(七大原则和单例模式篇)
  3. Oracle RAC(Real Application Clusters)
  4. “百度杯”CTF比赛 十月场 Hash 复现
  5. Android App自适应draw9patch不失真背景
  6. 测试人员面临的测试挑战和必备技能
  7. python tempfile模块用不了_Python tempfile:坏了还是我做错了?
  8. typescript接口定义
  9. (六)Neo4j综合项目
  10. Asterisk Queue呼叫中心的实现
  11. 【原创】MySQL Connector/C 库的版本选择
  12. mysql 函数无法访问_mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败...
  13. CentOS7安装Portainer实现docker可视化操作
  14. 2020-08-18
  15. 什么是竞态条件? 举个例子说明。
  16. java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...
  17. ROS中对URDF文件检查时出现的问题及解决方式
  18. 2023年还在问前端怎么学?一份前端学习指南
  19. php中关于文件操作的面试题,php面试题及答案
  20. 51单片机通过WIFI模块ESP8266控制LED灯

热门文章

  1. python pandas教程百家号_python--学习笔记6 pandas
  2. java找出一组数据缺少最小数组_Java获取一维数组的最小值实现方法
  3. 计算机组成与维修考试试题,期末考试试题计算机组成与维修.doc
  4. no amd graphics driver怎么解决_《英雄联盟手游》卡顿怎么解决 游戏设置优化教程...
  5. 双时隙的工作原理_双联开关的工作原理
  6. 从单片机工程师的角度看嵌入式Linux
  7. 我的特长是复制、粘帖
  8. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题
  9. linux禁止修 5在线阅读,linux – 如何在不重新编译内核的情况下禁用CentOS 5.3中的nf_conntrack内核模块...
  10. linux终端安装cuda,Ubuntu下安装CUDA10.0以及问题