QT 调用 DLL 的三种方法
Qt調(diào)用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"為動態(tài)庫里實現(xiàn)的函數(shù)名稱
lpfnDllFunc1 = (SetKeyBoardHook)GetProcAddress(hDLL, "SetKeyBoardHook");
if(lpfnDllFunc1 != NULL)
{
qDebug() << "SetKeyBoardHook加載成功";
bool flag = lpfnDllFunc1((HWND)this->winId());
if(flag)
{
qDebug() << "鉤子設(shè)置成功";
}
}
else
{
FreeLibrary(hDLL);
return;
}
}
}
顯式鏈接到 DLL,應(yīng)用程序必須:
1 調(diào)用 LoadLibrary(或相似的函 數(shù))以加載DLL和獲取模塊句柄。
2 調(diào)用 GetProcAddress,以獲取指向應(yīng)用程序要調(diào)用的每個導(dǎo)出函數(shù)的函數(shù)指針。由于應(yīng)用程序是通過指針調(diào)用DLL的函數(shù),編譯器不生成外部引用,故無需導(dǎo)入庫鏈接(不需要lib文件)。
3 使用完 DLL后調(diào)用FreeLibrary。
需要說明的是,typedef bool (CALLBACK* SetKeyBoardHook)(HWND);是聲明想要調(diào)用的函數(shù)指針,這個函數(shù)的參數(shù)必須和DLL里面的一樣。SetKeyBoardHook是DLL里面“實際的函數(shù)名”,必須和頭文件里面聲明的一樣,否則將會調(diào)用失敗。使用需要加Windows.h頭文件。Windows里的Qt是用Mingw GCC來編譯,而Mingw GCC可以支持Win32的API。使用時并不需要包含DLL的頭文件。編譯時可能會報錯error: cannot convert 'const char*' to 'LPCWSTR ^,只要在pro文件中添加DEFINES-= UNICODE即可。
Qt調(diào)用DLL方法二:使用Qt的API?
對于調(diào)用DLL的方法,Qt原來本身就有相應(yīng)的類來實現(xiàn),用起來和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調(diào)用DLL方法三:直接調(diào)用 DLL
VC的引用庫文件為xxx.lib, GCC的為xxx.a, 通過比較兩種庫文件的格式,發(fā)現(xiàn)很相似。于是把xxx.dll,xxx.lib和xxx.h復(fù)制到Qt的project下,直接把xxx.lib改為xxx.a, 根據(jù)Qt的庫名字的格式, 在xxx.a的前面加上lib, 即為libxxx.a。
再在Qt的.pro文 件中最后面加上
LIBS += -L. –lxxx //增加當(dāng)前目錄下的libxxx.a
在Qt的源文件中加上
#include “xxx.h”
現(xiàn)在就可以直接調(diào)用xxx.h中的函數(shù)了。
// 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包 含的實際函數(shù)名,必須實際存在
{
label1.setText(”Run DLL success!…”);
}
label1.show();
return a.exec();
}
總結(jié):?類似于調(diào)用DLL的交叉編程使用的場合很多,還可以用Qt生成DLL,給其它工具調(diào)用。說到底,VC和Qt等本質(zhì)上都是一樣的,只是提供了不同的C++庫。
總結(jié)
以上是生活随笔為你收集整理的QT 调用 DLL 的三种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集合源码阅读:ArrayList
- 下一篇: 注解 @Target 用法