Qt中调用VC6生成的动态库DLL文件

本文介绍如何在Qt环境中调用由VC6生成的动态链接库(DLL)文件,详细展示了从头文件包含、宏定义到函数指针定义及调用的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt中调用VC6生成的动态库DLL文件

2013-12-23 14:02
前些日子买了nRF24L01模块,用VS2005很快调试通过。转入Qt调试,不得法门。
几个月后的今天,又想起来了。
终于调试通过,方法如下:
1、在头文件加:#include <QLibrary>
2、复制厂家提供的宏定义
#define VID_NETUSB     0x10C4
#define PID_NETUSB903  0x8768
#define PID_NETUSB1100 0x8668
#define PID_NETUSB2401 0x8968
#define PID_NETUSB24L01 0x8570
#define HID_DEVICE_SUCCESS            0x00
#define HID_DEVICE_NOT_FOUND            0x01
#define HID_DEVICE_NOT_OPENED            0x02
#define HID_DEVICE_ALREADY_OPENED        0x03
#define    HID_DEVICE_TRANSFER_TIMEOUT        0x04
#define HID_DEVICE_TRANSFER_FAILED        0x05
#define HID_DEVICE_CANNOT_GET_HID_INFO    0x06
#define HID_DEVICE_HANDLE_ERROR            0x07
#define HID_DEVICE_INVALID_BUFFER_SIZE    0x08
#define HID_DEVICE_SYSTEM_CODE            0x09
#define HID_DEVICE_UNKNOWN_ERROR        0xFF
3、定义函数
typedef DWORD  (*NetusbGetNumDevices00)(WORD vid, WORD pid);//查找设备
NetusbGetNumDevices00 netusbGetNumDevices = NULL;//定义函数指针变量
typedef DWORD  (*NetusbOpen00)(DWORD deviceIndex, WORD vid, WORD pid);//打开
NetusbOpen00 netusbOpen = NULL;//定义函数指针变量
typedef DWORD  (*NetusbClose00)();//关闭
NetusbClose00 netusbClose = NULL;//定义函数指针变量
typedef DWORD  (*NetusbSendData00)(BYTE* buffer, DWORD bufferSize);//发送
NetusbSendData00 netusbSendData = NULL;//定义函数指针变量
typedef DWORD  (*NetusbSetTxaddr00)(BYTE addr0,BYTE addr1,BYTE addr2,BYTE addr3);//发送地址
NetusbSetTxaddr00 netusbSetTxaddr = NULL;//定义函数指针变量
typedef DWORD  (*NetusbSetRxaddr00)(BYTE addr0,BYTE addr1,BYTE addr2,BYTE addr3);//接收地址
NetusbSetRxaddr00 netusbSetRxaddr = NULL;//定义函数指针变量
4、加载,取函数指针
QLibrary dllLib("Netusb.dll");   。
if(!dllLib.load())    
{         ui->label_lianjie->setText(tr("未找到Netusb.dll"));     }
else    
{       
      netusbGetNumDevices = (NetusbGetNumDevices00)dllLib.resolve("_NetusbGetNumDevices@8");   
      netusbOpen = (NetusbOpen00)dllLib.resolve("_NetusbOpen@12");     
      netusbSendData=(NetusbSendData00)dllLib.resolve("_NetusbSendData@8");      
    if(netusbGetNumDevices == NULL)  ui->label_lianjie->setText(tr("初始化错误"));
     else ui->label_lianjie->setText(tr("初始化..."));    
}
5、调用 
void MainWindow::on_pushButton_lianjie_clicked()
{           
DWORD results;                      
  results = netusbGetNumDevices(VID_NETUSB, PID_NETUSB24L01);
   if (results ==1)
    {  
       results = netusbOpen(0,VID_NETUSB, PID_NETUSB24L01);  
           if (results != HID_DEVICE_SUCCESS)   
             {     
                    ui->label_lianjie->setText(tr("设备已连好"));     
            }                   
           else           
            {                                                }     
     }            
    else      
     {       
        ui->label_lianjie->setText(tr("未发现设备"));       
     }
}


中间第4步应注意,厂家提供函数名为
NetusbGetNumDevices(WORD vid, WORD pid);
NetusbOpen(DWORD deviceIndex, WORD vid, WORD pid);
NetusbClose();
NetusbSendData(BYTE* buffer, DWORD bufferSize);
实际用DLL函数查看器为


因为,函数名称不对,我纠结了很长时间。
可能是VC6的原因,在此不分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值