读书人

Qt调用Dll有关问题求解(Dll貌似VC生成

发布时间: 2012-07-15 20:20:05 作者: rapoo

Qt调用Dll问题求解(Dll貌似VC生成的)
最近老是和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__ 


运行结果如下:

D:/develop/Hello/AndonKB-build-desktop/debug/main.o:-1: In function `Z5qMainiPPc':
D:\develop\Hello\AndonKB-build-desktop/../HelloV1/main.cpp:25: 错误:undefined reference to `User_RealtimeConnect@4'
D:\develop\Hello\AndonKB-build-desktop/../HelloV1/main.cpp:26: 错误:undefined reference to `User_RealtimeSendData@24'
D:\develop\Hello\AndonKB-build-desktop/../HelloV1/main.cpp:27: 错误:undefined reference to `User_RealtimeDisConnect@4'
:-1: 错误:collect2: ld returned 1 exit status

构建项目就没过去,提示上面的错误,不知道是不是我的头文件没写对还是怎么了?后来想想,是不是.lib文件第三方是用VC生成的,而mingw用的gcc,这个.lib文件是不是根本就用不了?

上述问题把我整的人非人,鬼非鬼了,还请大侠们指点一二,分不够可再加。

[解决办法]
请使用标准API (LoadLibrary)加载调用看看
确定所调用DLL是否存在问题
[解决办法]
既然出错了,调用方式应该基本上没问题,要么是这个DLL的函数你使用不对,要么就是一些初始化条件没有满足。最好能到这个dll函数中大致分析一下问题,如果没有源代码,可能需要dll提供者提供一些信息,或者你参考一下dll对应的文档或者sample code。

读书人网 >VC/MFC

热点推荐