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

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 

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__