簡體   English   中英

libusb callback_in函數作為C ++中類的成員

[英]libusb callback_in function as a member of a class in C++

當在C ++中作為類的成員調用時,我在libusb_fill_bulk_transfer定義和使用回調函數時libusb_fill_bulk_transfer問題。

這是類中的定義:

namespace usb_connector
{
    class USBConnector
    {
    public:
        USBConnector();
        ~USBConnector();
        int connect(void);
        void read(void);
        void write(unsigned char *);
        void disconnect(void);
        void LIBUSB_CALL callback_in(struct libusb_transfer*);
...

這是類中的實現:

void LIBUSB_CALL usb_connector::USBConnector::callback_in(struct libusb_transfer *transfer)
{
    if (transfer == NULL) {
        cout << "No libusb_transfer..." << endl;
    }
    else {
        cout << "libusb_transfer structure: " << endl;
        cout << "actual_length = " << transfer->actual_length << endl;
        for (int i = 0; i < transfer->actual_length; i++) {
            cout << transfer->buffer[i];
        }
        cout << endl;
    }

    return;
}

以下是我稱之為:

...
...
libusb_fill_bulk_transfer( transfer_in, usb_dev, USB_ENDPOINT_IN,
            in_buffer,  LEN_IN_BUFFER, callback_in, NULL, 0);
...
...

我得到的錯誤如下:

錯誤:無法將'usb_connector :: USBConnector :: callback_in'從類型'void(usb_connector :: USBConnector ::)(libusb_transfer *)'轉換為'libusb_transfer_cb_fn {aka void( )(libusb_transfer )}'in_buffer,LEN_IN_BUFFER,callback_in, NULL,0);

如何將回調函數作為類的成員以及如何調用它?

指向類成員函數的指針和指向函數的指針在C ++中是不兼容的。

根據文檔,回調的原型是:

typedef void( * libusb_transfer_cb_fn) (struct libusb_transfer *transfer)

struct libusb_transferuser_data字段,顯然在你設置回調期間填寫,所以你需要一個包裝器:

void LIBUSB_CALL callback_wrapper(struct libusb_transfer *transfer)
{
    usb_connector::USBConnector *connector = reinterpret_cast<usb_connector::USBConnector*>(transfer->user_data);
    connector->callback_in(transfer);
}

並通過this通話過程中:

...
...
libusb_fill_bulk_transfer( transfer_in, usb_dev, USB_ENDPOINT_IN,
            in_buffer,  LEN_IN_BUFFER, callback_wrapper, this, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM