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