QT调用动态库DLL的深坑,给填一下
.h中声明
//回调函数指针声明
typedef CGrabber* (*GetGraber)(void); //定义函数指针,以备调用
QLibrary *IGrablib;
GetGraber getGraber;
CGrabber* pGrab;
.cpp中实现,重点关注其中的正确用法,涨知识了
//加载动态库
IGrablib=new QLibrary("DHGrabberForMER64.DLL");
if(IGrablib->load())
{
qDebug()<<QString::fromLocal8Bit("初始化库成功!");
}
else
{
qDebug()<<QString::fromLocal8Bit("初始化库失败!");
}
//获取函数地址
getGraber=(GetGraber)IGrablib->resolve("GetGrabber");
//正确用法
//实例化运行一次,非常重要
pGrab = getGraber();
//相机初始化
pGrab->Init(&gbinitStruct);
//启动相机
pGrab->StartGrab();
//停止采集
pGrab->StopGrab();
//关闭设备
pGrab->Close()
再来看下错误用法,每次会提示初始化成功,但是每次相机都不能正常启动
//相机初始化
getGraber()->Init(&gbinitStruct);
//启动相机
getGraber()->StartGrab();
//停止采集
getGraber()->StopGrab();
//关闭设备
getGraber()->Close()
分析原因:
getGraber()每运行一次,都会实例化一个对象,导致每次初始化和相机启动是在不同对象上实现的