Qt调用Dll有关问题求解(Dll貌似VC生成的)
Qt调用Dll问题求解(Dll貌似VC生成的)
最近老是和Dll打交道,我的环境是QT4.7.2+mingw,现在调用第三方提供的一个dll,问题层出不穷,还得请大伙来帮帮忙。第三方dll以及相关文件均可在此网址下载。
第一次尝试:使用QLibrary
程序输出如下:
177279476
177280006
177280156
1
load 0x2c051230
0 -----此处出现内存读写错误提示框,程序退出
D:\develop\Hello\HelloV2-build-desktop\debug\AndonKB.exe 退出, 代码: -1073741819
这里的问题很郁闷人,弹出一个错误框--内存读写错误。请大侠指定哪里有错?是不是那个pixmap.toWinHBITMAP()的问题?
后来我改用静态调用,代码如下:
第二次尝试:静态调用
EQ2008_Dll.h头文件代码如下:
最近老是和Dll打交道,我的环境是QT4.7.2+mingw,现在调用第三方提供的一个dll,问题层出不穷,还得请大伙来帮帮忙。第三方dll以及相关文件均可在此网址下载。
第一次尝试:使用QLibrary
- C/C++ code
#include <QtGui> #include <QTextCodec> #include <QtDebug> #include <windows.h> #include "EQ2008_Dll.h" int main(int argc, char *argv[]) { //不用管这里 QApplication app(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); //从这里开始 QLibrary bxLib("EQ2008_Dll.dll"); if(!bxLib.load())//加载dll return 0; //定义函数指针 typedef BOOL (*ledConnect)(int cardNum); typedef BOOL (*ledSend)(int CardNum,int x,int y,int iWidth,int iHeight,HBITMAP hBitmap); typedef BOOL (*ledDisConnect)(int cardNum); //解析动态链接库中的函数 ledConnect ledconnect = (ledConnect)bxLib.resolve("User_RealtimeConnect"); ledSend ledsend = (ledSend)bxLib.resolve("User_RealtimeSendData"); ledDisConnect leddisconnect = (ledDisConnect)bxLib.resolve("User_RealtimeDisConnect"); //打印函数地址 qDebug() << (int)ledconnect; qDebug() << (int)ledsend; qDebug() << (int)leddisconnect; //使用dll函数进行设备连接 qDebug() << ledconnect(1); QPixmap pixmap; QLabel label; if(pixmap.load("D:/pic.bmp")){ label.setPixmap(pixmap); qDebug() << "load" << pixmap.toWinHBITMAP(); //使用dll函数向设备发送数据 qDebug() << ledsend(1,0,0,16*16,16*14,pixmap.toWinHBITMAP()); } label.show(); //使用dll函数断开与设备的连接 qDebug() << leddisconnect(1); return app.exec(); }
程序输出如下:
177279476
177280006
177280156
1
load 0x2c051230
0 -----此处出现内存读写错误提示框,程序退出
D:\develop\Hello\HelloV2-build-desktop\debug\AndonKB.exe 退出, 代码: -1073741819
这里的问题很郁闷人,弹出一个错误框--内存读写错误。请大侠指定哪里有错?是不是那个pixmap.toWinHBITMAP()的问题?
后来我改用静态调用,代码如下:
第二次尝试:静态调用
- C/C++ code
#include <QtGui> #include <QTextCodec> #include <QtDebug> #include <windows.h> #include "EQ2008_Dll.h" int main(int argc, char *argv[]) { //不用管这里 QApplication app(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); QLabel label; QPixmap pixmap; pixmap.load("D:/pic.bmp"); HBITMAP bitmap = pixmap.toWinHBITMAP(); label.setPixmap(QPixmap::fromWinHBITMAP(bitmap)); label.show(); User_RealtimeConnect(1); User_RealtimeSendData(1,0,0,256,224,bitmap); User_RealtimeDisConnect(1); return app.exec(); }
EQ2008_Dll.h头文件代码如下:
- C/C++ code
#ifndef __EQ2008_DLL__ #define __EQ2008_DLL__ #ifndef MY_EXPORT #define MY_EXPORT __declspec(dllexport) #endif #include "EQ2008_DataStruct.h" /****************参数说明******************/ //通讯方式常量 #define DEVICE_TYPE_COM 0 //串口通讯 #define DEVICE_TYPE_NET 1 //网络通讯 //串行通讯速度常量 #define SBR_9600 9600 #define SBR_19200 19200 #define SBR_57600 57600 #define SBR_115200 115200 //EQ3002/2008控制卡类型 #define EQ3002_I 0 #define EQ3002_II 1 #define EQ3002_III 2 #define EQ2008_I 3 #define EQ2008_II 3 //颜色常量 #define RED 0x0000FF #define GREEN 0x00FF00 #define YELLOW 0x00FFFF //返回值常量 #define EQ_FALSE 0 #define EQ_TRUE 1 /***************************************/ //添加节目 extern "C" MY_EXPORT int __stdcall User_AddProgram(int CardNum,BOOL bWaitToEnd,int iPlayTime); //添加图文区 extern "C" MY_EXPORT int __stdcall User_AddBmpZone(int CardNum,User_Bmp *pBmp,int iProgramIndex); extern "C" MY_EXPORT BOOL __stdcall User_AddBmp(int CardNum,int iBmpPartNum,HBITMAP hBitmap,User_MoveSet* pMoveSet,int iProgramIndex); //添加文本区 extern "C" MY_EXPORT int __stdcall User_AddText(int CardNum,User_Text *pText,int iProgramIndex); //添加RTF区 extern "C" MY_EXPORT int __stdcall User_AddRTF(int CardNum,User_RTF *pRTF,int iProgramIndex); //添加单行文本区 extern "C" MY_EXPORT int __stdcall User_AddSingleText(int CardNum,User_SingleText *pSingleText,int iProgramIndex); //添加时间区 extern "C" MY_EXPORT int __stdcall User_AddTime(int CardNum,User_DateTime *pDateTime,int iProgramIndex); //添加计时区 extern "C" MY_EXPORT int __stdcall User_AddTimeCount(int CardNum,User_Timer *pTimeCount,int iProgramIndex); //添加温度区 extern "C" MY_EXPORT int __stdcall User_AddTemperature(int CardNum,User_Temperature *pTemperature,int iProgramIndex); //删除节目 extern "C" MY_EXPORT BOOL __stdcall User_DelProgram(int CardNum,int iProgramIndex); //删除所有节目 extern "C" MY_EXPORT BOOL __stdcall User_DelAllProgram(int CardNum); //发送数据 extern "C" MY_EXPORT BOOL __stdcall User_SendToScreen(int CardNum); //关机 extern "C" MY_EXPORT BOOL __stdcall User_CloseScreen(int CardNum); //开机 extern "C" MY_EXPORT BOOL __stdcall User_OpenScreen(int CardNum); //校正板卡的时间 extern "C" MY_EXPORT BOOL __stdcall User_AdjustTime(int CardNum); //实时发送数据 extern "C" MY_EXPORT BOOL __stdcall User_RealtimeConnect(int CardNum); //建立连接 extern "C" MY_EXPORT BOOL __stdcall User_RealtimeSendData(int CardNum,int x,int y,int iWidth,int iHeight,HBITMAP hBitmap); //发送数据 extern "C" MY_EXPORT BOOL __stdcall User_RealtimeDisConnect(int CardNum); //断开连接 //亮度调节 extern "C" MY_EXPORT BOOL __stdcall User_SetScreenLight(int CardNum,int iLightDegreen); //回读显示屏内容 extern "C" MY_EXPORT BOOL __stdcall User_ReadScreen(int CardNum,HDC DisplayDC); //回读显示屏节目 extern "C" MY_EXPORT BOOL __stdcall User_ReadProgram(int CardNum,char *strFileName); /********************************************************************************/ #endif //__EQ2008_DLL__