Что у меня получилось:
Код: Выделить всё
void MyCallback(double a, unsigned char b, unsigned char* c)
{
// do something
}
Код: Выделить всё
extern "C" BOOL CALLBACK ExternalDLL_SetCallback(void(*pCallbackFunc)(double a, unsigned char b, unsigned char* c));
Код: Выделить всё
ExternalDLL_SetCallback(&MyCallback); // this works
Я пытался использовать 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
Есть ли простой способ обойти эту ловушку, не углубляясь слишком далеко в реализацию в стиле ассемблера?
На практике У меня будет несколько объектов MyClass, устанавливающих свои обратные вызовы и время от времени вызываемых из внешней DLL. Если обратный вызов является функцией-членом, каждый вызов автоматически назначается правильному объекту MyClass.
Но, поскольку пока я могу получить только статическую функцию обратного вызова, я не не вижу хорошего способа отслеживать, какой объект зарегистрировал обратный вызов при его поступлении.
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
п>
Подробнее здесь: https://stackoverflow.com/questions/793 ... unction-in