c++ - libusb_get_device_list 段错误

标签 c++ qt segmentation-fault libusb

我正在用 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/

相关文章:

c++ - 如何知道 QPlainTextEdit 继承类中是否显示水平滚动条?

c++ - 如何在 Manjaro KDE 下编译 Qt 应用程序?

c++ - 为什么 C++ std vector 会在分配或调整大小时出现段错误?

C 帮助解释 calloc segfault

具有二进制数据的 C++ fstream << 和 >> 运算符

c++ - LNK2019 在QtCreator中使用WinMain时

C++ 将对象实例化的源代码行记录为不带宏的常量表达式

c - main 执行前出现段错误

c++ - main() 如何处理不带省略号的可变数量的参数?

c++ - C++ 类中类的语法