西安电工的个人主页

http://www.qtcn.org/bbs/u/123530  [收藏] [复制]

zjc810826

  • 8

    关注

  • 7

    粉丝

  • 26

    访客

  • 等级:新手上路
  • 总积分:21
  • 男,1981-09-23

最后登录:2021-05-31

更多资料

日志

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的原因,在此不分析。








分类:默认分类|回复:3|浏览:2983|全站可见|转载
 
 
删除

zjc810826:今天在CSDN上看到有人转载了这篇文章,并注明了一个“转”,感谢网友支持

2015-03-20 11:30 -
删除

pain22:qt怎么调用vc6.0的dll,求指导

2014-01-02 13:29 -

zjc810826:QQ:359436299

2014-03-04 08:37

Powered by phpwind v8.7 Certificate Copyright Time now is:05-21 00:08
©2005-2016 QTCN开发网 版权所有 Gzip disabled