C++ 如何在C+中将回调函数传递给libusb批量传输函数+;等级

C++ 如何在C+中将回调函数传递给libusb批量传输函数+;等级,c++,callback,usb,function-pointers,libusb,C++,Callback,Usb,Function Pointers,Libusb,我正在使用libusb与usb设备交互。我已经创建了一个类,一个成员函数将接收来自设备的输入并对其进行处理。我使用的是异步api。现在,libusb\u fill\u bulk\u transfer()函数调用抛出编译错误: void MyDeviceClass::on_connectButton_clicked() { int r; //for return values ssize_t cnt; //holding number of devices in list r =

我正在使用libusb与usb设备交互。我已经创建了一个类,一个成员函数将接收来自设备的输入并对其进行处理。我使用的是异步api。现在,libusb\u fill\u bulk\u 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);
}
void MyDeviceClass::on_connectButton_clicked()
{
int r;//用于返回值
ssize_t cnt;//保存列表中的设备数
r=libusb_init(&ctx);//为我们刚刚声明的会话初始化库
if(r<0){

qDebug()使用非成员函数时,编译错误是什么

编辑:这应该是LIBUSB_调用:

    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);
    }

正如您自己回答的那样,实际上应该是由LIBUSB_调用定义的u stdcall。他们的文档应该包括在函数指针typedef中,以消除歧义。

我将成员函数设置为静态,需要修改原型:

 static void LIBUSB_CALL readDataFromBuffer(struct libusb_transfer *);

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)
可以向类中添加静态类函数,并调用非静态成员函数 此静态函数中类的

此对象将位于void*user_数据的位置

静态类函数中必须转换
传输->用户数据正确地传输到您的类。

我在非成员函数错误C2664中得到以下错误:“libusb\u填充\u中断\u传输”:无法将参数6从“void(\uu cdecl*)(libusb\u传输*)”转换为“libusb\u传输\u cb\u fn”确定,因此它需要是“stdcall”。
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)