如何将回调函数传递给 libusb 批量传递函数C++类

How to pass callback function to libusb bulk transfer function in C++ Class

本文关键字:libusb 传递函数 C++ 回调 函数      更新时间:2023-10-16

我正在使用libusb与USB设备进行交互。我创建了一个类,一个成员函数将从设备接收输入并对其进行处理。我正在使用异步 api。现在 libusb_fill_bulk_transfer() 函数调用抛出编译错误:

void MyDeviceClass::on_connectButton_clicked()
{
   int r; //for return values
   ssize_t cnt; //holding number of devices in list
   r = libusb_init(&ctx); //initialize the library for the session we just declared
   if(r < 0) {
      qDebug()<<"Init Error "<<r<<endl; //there was an error
      return;
   }
   ...
   ...
   ...
   libusb_fill_bulk_transfer( transfer_in, dev_handle, USB_ENDPOINT_IN,
            inBuffer, LEN_IN_BUFFER,readDataFromBuffer,NULL,0);
   libusb_submit_transfer(transfer_in);
   QtConcurrent::run (this,&MyDeviceClass::eventThread);
}

编译器建议使用 &MyDeviceClass::readDataFromBuffer 作为函数指针,但这仍然会引发错误。我尝试使用静态成员,甚至静态非成员函数,但都是徒劳的。请帮助我将回调传递给此函数。我正在使用Qt,可能不喜欢使用boost库。请注意,libusb_fill_bulk_transfer(...) 是在 MyDeviceClass 的成员函数中调用的。

我使成员函数静态,原型需要修改:

 static void LIBUSB_CALL readDataFromBuffer(struct libusb_transfer *);
使用

非成员函数时编译错误是什么?

编辑:这应该是LIBUSB_CALL:

    void LIBUSB_CALL BulkTransferCallback(struct libusb_transfer *transfer) {
        // This assumes that you set transfer::user_data to be a pointer to 
        // an instance of the MyDeviceClass class.
        MyDeviceClass* mdc = reinterpret_cast<MyDeviceClass*>(transfer->user_data);
        mdc->onBulkTransferCallback(transfer);
    }

然后,在设置指针时,请使用:

transfer.callback = &BulkTransferCallback;

正如你自己回答的那样,实际上它应该是__stdcall由LIBUSB_CALL定义的。 他们的文档应将此包含在函数指针 typedef 中,以消除歧义。

lib_usb API 定义函数libusb_fill_bulk_transfer:

static void     libusb_fill_bulk_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
可以将静态类函数

添加到并调用非静态成员函数此静态函数中的类。

这个对象将在无效的地方*user_data

静态类函数中,您必须强制转换>user_data正确转移到您的班级。