2013-10-21 27 views
0

我使用的libusb到与USB设备进行交互。我创建了一个类,一个成员函数将接收来自设备的输入并处理它。我正在使用异步api。现在libusb_fill_bulk_transfer()函数调用抛出一个编译错误:如何通过回调函数与libusb批量传输函数在C++类

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的成员函数中调用。

回答

0

我提出的成员函数的静态和需要修改原型:

static void LIBUSB_CALL readDataFromBuffer(struct libusb_transfer *); 
+0

好吧,所以它需要是__stdcall。 – Pete

0

什么是编译错误,当你使用一个非成员函数?

编辑:这应该是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中包含这个以消除歧义。

+0

我得到在非成员函数错误C2664以下错误:libusb_fill_interrupt_transfer':不能从“无效转换参数6(__cdecl *) (libusb_transfer *)'到'libusb_transfer_cb_fn' –