Использование std::bind, функции Lambda или альтернатив для передачи функции обратного вызова в стиле c во внешнюю dll.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Использование std::bind, функции Lambda или альтернатив для передачи функции обратного вызова в стиле c во внешнюю dll.

Сообщение Anonymous »

Я хочу передать член класса как функцию обратного вызова в стиле C внешней DLL.
Что у меня получилось:

Код: Выделить всё

void MyCallback(double a, unsigned char b, unsigned char* c)
{
// do something
}
DLL предоставляет определение:

Код: Выделить всё

extern "C" BOOL CALLBACK ExternalDLL_SetCallback(void(*pCallbackFunc)(double a, unsigned char b, unsigned char* c));

Код: Выделить всё

ExternalDLL_SetCallback(&MyCallback); // this works
Поскольку мне нужен доступ к членам класса MyClass внутри функции обратного вызова, я хочу, чтобы MyCallback стал членом класса.
Я пытался использовать std::bind(), чтобы захватить это и передать его с помощью обратного вызова:

Код: Выделить всё

using namespace std::placeholders;
typedef void (*cbf_t)(double, unsigned char, unsigned char*);

class MyClass {
public:
void MyCallback(double a, unsigned char b, unsigned char* c) { this->doClassStuff(a); }; // callback function as a class member
void doClassStuff(double a); // example function
void setCallback() {
m_cbfunc = std::bind(&MyClass::MyCallback, this, _1, _2, _3);
ExternalDLL_SetCallback((cbf_t)&m_cbfunc);
};
std::function m_cbfunc;
}
На самом деле это компилируется и запускается, но программа завершается, как только фактически вызывается обратный вызов. К сожалению, программу можно выполнить только на удаленном компьютере, где у меня нет возможности использовать отладчик.
Я также пытался использовать лямбда-функцию для магического захвата:

Код: Выделить всё

m_cbfunc = [this](double a, unsigned char b, unsigned char* c) { this->doClassStuff(a); }; // Lambda callback function
Скорее всего, в любом случае источником зла здесь является преобразование в стиле C (cbf_t). static_cast(std::bind(...)) или static_cast(std::function(...)) помечены компилятором, так что, вероятно, это не так даже нет смысла приводить результат к указателю на функцию.
Есть ли простой способ обойти эту ловушку, не углубляясь слишком далеко в реализацию в стиле ассемблера?
На практике У меня будет несколько объектов MyClass, устанавливающих свои обратные вызовы и время от времени вызываемых из внешней DLL. Если обратный вызов является функцией-членом, каждый вызов автоматически назначается правильному объекту MyClass.
Но, поскольку пока я могу получить только статическую функцию обратного вызова, я не не вижу хорошего способа отслеживать, какой объект зарегистрировал обратный вызов при его поступлении.
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
п>

Подробнее здесь: https://stackoverflow.com/questions/793 ... unction-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»