2013-10-21 29 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' –