最近在调用卡尔的库函数时候,发现他们仅仅提供了一个dll,于是百度调研QT动态加载dll的方式,在调用成功后分析给大家。
动态调用。在使用的时候才会加载dll进来,使用QT本身自己的加载机制,利用QLibrary进行动态加载。
typedef void (*CB_AnswerData)(const char *pBuf,int iLen);
typedef int (*FunCardcallback)(CB_AnswerData );
void cardInfoCallback(const char *pBuf,int iLen)
{
}
void MainWindow::on_pushButton_3_clicked()
{
if(true)
{
QLibrary lib("KeUsbHid.dll");
if(lib.load())
{
qDebug() << "load DLL succeed";
//usb回调
try
{
FunUSBcallback usbBack=(FunUSBcallback)lib.resolve("_KERECEIVER_SetUSBStatusCallBack@4");
}
catch (...)
{
qDebug() << "usb catch---------------------catch";
}
}
else
{
}
}
}
注意事项:
(1)dll中的函数我们在调用过程中,需要在调用类中重新写一个带有形参个数和类型都一样的函数,就像本文的FunCardcallback,它在这里是作为回调函数使用的。
(2)包含头文件#include "QLibrary"。
(3)把调用的dll放在exe所在路径中。
(4)分享一个小工具用于查看dll的函数原型,Stud_PE.exe。这个可以查看dll的导出表。