QT调用Dll(貌似是VC生成的Dll)

hitexam 2011-06-14 12:35:15
最近老是和Dll打交道,我的环境是QT4.7.2+mingw,现在调用第三方提供的一个dll,问题层出不穷,还得请大伙来帮帮忙。第三方dll以及相关文件均可在此网址下载。
第一次尝试:使用QLibrary

#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;

qDebug() << ledconnect(1);

QPixmap pixmap;

QLabel label;
if(pixmap.load("D:/pic.bmp")){
label.setPixmap(pixmap);
qDebug() << "load" << pixmap.toWinHBITMAP();
qDebug() << ledsend(1,0,0,16*16,16*14,pixmap.toWinHBITMAP());
}

label.show();
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()的问题?
后来我改用静态调用,代码如下:

第二次尝试:静态调用


#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头文件代码如下:

#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文件是不是根本就用不了?

上述问题把我整的人非人,鬼非鬼了,还请大侠们指点一二,分不够可再加。
...全文
407 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitexam 2011-06-14
  • 打赏
  • 举报
回复
第一种要加__stdcall吗?QLibrary中类似代码都没加啊
hitexam 2011-06-14
  • 打赏
  • 举报
回复
第一种要加__stdcall吗?QLibrary中类似代码都没加啊
dext 2011-06-14
  • 打赏
  • 举报
回复
你的尝试 很不错,分析的也对,但是,你的第一种情况,为什么 不加 __stdcall?

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧