Visual Studio: проблема с функцией обратного вызова (__cdecl *) - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть приложение на C, которое хорошо работает в Ubuntu, но мне нужно перенести его на Visual Studio, и там начинаются проблемы.Я использую Visual Studio 2017, и моя проблема с функциями обратного вызова, которые я использую.В этом коде мне нужно зарегистрировать две функции обратного вызова (почти один и тот же код, просто одна предназначена для отправки данных, другая - для их получения).

libusb_fill_bulk_transfer(recv_transfer_desc,         //transfer descriptor struct
        usb_dev_handle,             //usb device handle
        EP1_IN,                    //unsigned char
        in_buffer,                 //unsigned char*
        len,                        //tranfer length, int
        recv_transfer_finished_cb,  //callback func
        &my_recv_cb_data,           //void*, callback user data
        timeout);                 //unsigned int

Это дает следующую ошибку: C2440 'function': cannot convert from 'void (__cdecl *)(libusb_transfer *)' to 'libusb_transfer_cb_fn'

Я никогда не использую VS, поэтому я действительно не знаю, как решить эту проблему.Для меня это выглядит так, как будто что-то нужно преобразовать во что-то, но просто не могу понять.

Это сигнатура функции обратного вызова, которую я пытаюсь обработать: static void recv_transfer_finished_cb(struct libusb_transfer *);

1 Ответ

0 голосов
/ 17 сентября 2018

Я только что разобрался, методом проб и ошибок.

Проблема заключалась в том, что вызов по умолчанию в VS равен __cdecl, и его нельзя использовать для функций обратного вызова, которые должны быть __stdcall.

Чтобы решить мою проблему, мне нужно было изменить сигнатуру функции обратного вызова с: static void send_transfer_finished_cb(struct libusb_transfer *); Для того, чтобы: static void __stdcall send_transfer_finished_cb(struct libusb_transfer *);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...