QT 调用 DLL 的三种方法
Qt调用DLL方法一:使用Win32 API
h文件
typedef bool (CALLBACK* SetKeyBoardHook)(HWND);
HINSTANCE hDLL; // Handle to DLL
SetKeyBoardHook lpfnDllFunc1; // Function pointer
cpp文件
void MainWindow::test()
{
hDLL = LoadLibrary("dllhook");//"dllhook"为DLL的文件名
if(hDLL != NULL)
{
qDebug() << "dllhook加载成功";
//"SetKeyBoardHook"为动态库里实现的函数名称
lpfnDllFunc1 = (SetKeyBoardHook)GetProcAddress(hDLL, "SetKeyBoardHook");
if(lpfnDllFunc1 != NULL)
{
qDebug() << "SetKeyBoardHook加载成功";
bool flag = lpfnDllFunc1((HWND)this->winId());
if(flag)
{
qDebug() << "钩子设置成功";
}
}
else
{
FreeLibrary(hDLL);
return;
}
}
}
显式链接到 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文件
void MainWindow::test()
{
QLibrary mylib("dllhook");
if(mylib.load())
{
qDebug() << "dllhook加载成功";
SetKeyBoardHook open = (SetKeyBoardHook)mylib.resolve("SetKeyBoardHook");
if(open)
{
qDebug() << "SetKeyBoardHook加载成功";
bool flag = open((HWND)this->winId());
}
}
}
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 的三种方法相关推荐
- C++/CLI Winform中调用DLL的三种方法
一,传统的LoadLibrary 二,#pragma comment(lib,""),需要lib文件 三,dllImport 一比较适合调用自己的dll的api,二比较适合调用系统 ...
- C#调用DLL的几种方法
c#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素 ...
- php前台调用后台方法,JavaScript_JavaScript调用后台的三种方法实例,方法一:直接使用%=%调 - phpStudy...
JavaScript调用后台的三种方法实例 方法一:直接使用调用 前台JS: var methodStr = ""; alert(methodStr); 后头方法: public ...
- python调用cmd命令释放端口_详解python调用cmd命令三种方法
目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...
- zpl java_JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)...
JAVA调用DLL的两种方法 (2008-03-05 17:24:48) 标签: 问题描述: 方法一,使用JNI: public class TestNative { private native s ...
- 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】
C#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...
- python cmd命令大全-详解python调用cmd命令三种方法
目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...
- 详解python运行三种方式_详解python调用cmd命令三种方法
目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...
- Qt工作笔记-第三种方法在QGraphics上写文本
前面的两种方法: QGraphicsSimpleTextIte和QGraphicsTextItem 如下: https://blog.csdn.net/qq78442761/article/detai ...
最新文章
- 010——VUE中使用lodash库减少watch对后台请求的压力
- Java设计模式(七大原则和单例模式篇)
- Oracle RAC(Real Application Clusters)
- “百度杯”CTF比赛 十月场 Hash 复现
- Android App自适应draw9patch不失真背景
- 测试人员面临的测试挑战和必备技能
- python tempfile模块用不了_Python tempfile:坏了还是我做错了?
- typescript接口定义
- (六)Neo4j综合项目
- Asterisk Queue呼叫中心的实现
- 【原创】MySQL Connector/C 库的版本选择
- mysql 函数无法访问_mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败...
- CentOS7安装Portainer实现docker可视化操作
- 2020-08-18
- 什么是竞态条件? 举个例子说明。
- java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...
- ROS中对URDF文件检查时出现的问题及解决方式
- 2023年还在问前端怎么学?一份前端学习指南
- php中关于文件操作的面试题,php面试题及答案
- 51单片机通过WIFI模块ESP8266控制LED灯
热门文章
- python pandas教程百家号_python--学习笔记6 pandas
- java找出一组数据缺少最小数组_Java获取一维数组的最小值实现方法
- 计算机组成与维修考试试题,期末考试试题计算机组成与维修.doc
- no amd graphics driver怎么解决_《英雄联盟手游》卡顿怎么解决 游戏设置优化教程...
- 双时隙的工作原理_双联开关的工作原理
- 从单片机工程师的角度看嵌入式Linux
- 我的特长是复制、粘帖
- zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题
- linux禁止修 5在线阅读,linux – 如何在不重新编译内核的情况下禁用CentOS 5.3中的nf_conntrack内核模块...
- linux终端安装cuda,Ubuntu下安装CUDA10.0以及问题