我正在用 Qt C++ 编写一个文件资源管理器应用程序,并有一个 libUSB 函数(QList UsbDevice::getDeviceList()),它获取所有连接的 USB 设备,检查每个设备的我的产品供应商和产品 ID,声明它们并返回他们在一个数组中。这一切都很好,我得到了我想要的设备,但是我添加了一个刷新按钮,它应该更新下拉列表中显示的设备列表(它基本上再次调用 getDeviceList 函数)但是它在调用时出现错误:
int numDevices = libusb_get_device_list(NULL, &usbDevices);
第二次,我终究还是不明白为什么。如果有人可以检查下面的代码,看看我是否遗漏了一些愚蠢的东西,那将非常有帮助。
QList<UsbDevice*> UsbDevice::getDeviceList()
{
unsigned char manf[256] = {'\0'};
QList<UsbDevice*> usbDeviceList;
libusb_device **usbDevices;
struct libusb_device_descriptor desc;
int numDevices = libusb_get_device_list(NULL, &usbDevices);
if(numDevices < 0)
{
libusb_free_device_list(usbDevices, 1);
return usbDeviceList;
}
QString error;
for(int i=0; i!=numDevices; ++i)
{
libusb_device *dev = usbDevices[i];
libusb_get_device_descriptor(dev, &desc);
if((desc.idVendor != VendorUsbId) && (desc.idProduct != ProductUsbId))
continue;
libusb_device_handle *handle = NULL;
libusb_config_descriptor *conf_desc = NULL;
int result = 0;
result = libusb_open(dev, &handle);
if(result < 0)
{
if(result == -3)
{
}
error = QString(libusb_error_name(result));
continue;
}
int config = 1;
if( handle == NULL)
{
continue;
}
result = libusb_set_configuration(handle, config);
if(result < 0)
{
error = QString(libusb_error_name(result));
continue;
}
result = libusb_get_config_descriptor(dev, 0, &conf_desc);
if(result < 0)
{
error = QString(libusb_error_name(result));
continue;
}
result = libusb_claim_interface(handle, 0);
if(result < 0)
{
error = QString(libusb_error_name(result));
continue;
}
result = libusb_get_string_descriptor_ascii(handle, desc.iProduct, manf, sizeof(manf));
if(result < 0)
{
error = QString(libusb_error_name(result));
continue;
}
UsbDevice *newDevice = new UsbDevice();
newDevice->setDeviceName(QString((char*)manf));
newDevice->setHandle(handle);
usbDeviceList << newDevice;
}
libusb_free_device_list(usbDevices, 1);
return usbDeviceList;
}
最佳答案
您在程序开始时调用了 libusb_init()
,但您也在开始时调用了 libusb_exit()
:在调用 a.exec 之前()
。
您的第一个调用可能发生在 MainWindow
构造函数中?
您可以改为子类化 QApplication
,在构造函数中调用 libusb_init()
,在析构函数中调用 libusb_exit()
。
关于c++ - libusb_get_device_list 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23950587/