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文件
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 的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集合源码阅读:ArrayList
- 下一篇: c++ (QT)笔记