西安电工的菜园 https://passport2.21ic.com/?233153 [收藏] [复制] [RSS] 技术笔记

日志

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

已有 976 次阅读2013-12-23 14:01 |个人分类:Qt|系统分类:原稿与翻译| 动态库, VS2005, 调用, VC6

前些日子买了nRF24L01模块,用VS2005很快调试通过。转入Qt调试,不得法门。
几个月后的今天,又想起来了。
终于调试通过,方法如下:
1、加头文件: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的原因,在此不分析。

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 庄庄 2015-3-20 11:46
今天在CSDN上看到有人转载了这篇文章,并注明了一个“转”,感谢网友支持