Вообще, callback-функции принято снабжать параметром контекста, передавая его вместе с адресом функции в вызывающую библиотеку/подсистему, а она при вызове функции передает ей в числе прочих этот параметр. Таким образом callback-функция может привязаться к некоторому набору данных, в роли которого часто выступает объект класса, а в параметре контекста передается значение this.
Возможно, в Вашем случае роль контекста играет параметр nPort, и к нему можно как-то привязать адрес объекта. Ведь callback-функция вызывается не в вакууме — она должна как-то сообразить, где взять нужные данные, или что делать с переданными данными. Очевидно, параметр nPort как-то описывает "порт", "канал" или что-то в этом роде, а там уже хранится информация о контексте и состоянии.
В случае реализации callback, безотносительно длл, использовать нормальные функторы:
boost::function<void ()> f = boost::bind(&MyClass::Function, &my_class_object);
SetCallback(f);
А>Здравствуйте, Anpek, Вы писали:
A>>Здравствуйте, Аноним, Вы писали: A>>Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс
А>ReadDataCallBack(DWORD nPort, UCHAR *pPacketBuffer, DWORD nPacketSize);
А>MP4_ClientStart(&m_SClientVideoInfo, ReadDataCallBack);
А>это все пересылается в dll
А>как это связять с virtual
тут все серьёзнее, т.к. нельзя менять интерфейс длл, можно выкрутится например так (главное учесть все возможные грабли, начиная от инициализации статических объектов и заканчивая потокобезопасностью):
Здравствуйте, Аноним, Вы писали:
Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс
C++ callback
От:
Аноним
Дата:
08.04.11 09:42
Оценка:
Привет всем
какие идеии
каким образом передать фунцию класса как callback
Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
Re[2]: C++ callback
От:
Аноним
Дата:
08.04.11 09:53
Оценка:
Здравствуйте, Anpek, Вы писали:
A>Здравствуйте, Аноним, Вы писали: A>Сделать чисто виртуальный класс с одной этой функцией, твой класс отнаследовать от этого виртуального, переопределить эту функецию, и тому, кому нужен этот Callback давать указатель на этот вирутальный класс
Здравствуйте, Аноним, Вы писали:
А>Привет всем А>какие идеии А>каким образом передать фунцию класса как callback А>Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
В случае с полностью рантайм-логикой — никак, т.к. все методы инстанса какого-либо класса имеют один неявный параметр, в который передаётся указатель на инстанс класса. Фактически — это и есть this.
Здравствуйте, Аноним, Вы писали:
> какие идеии > каким образом передать фунцию класса как callback > Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
Можно попробовать сделать обычный класс Function и переопределить другие дочерние классы типа GenericFunction.
Вот один из примеров реализации GenericFunction с IBM blogs. Не спрашивайте откуда, но как-то недавно набрел, сохранил в закладки, ибо известный подход "обёртки".
Здравствуйте, Аноним, Вы писали:
А>Привет всем А>какие идеии А>каким образом передать фунцию класса как callback А>Статический метод не подходит так как надо делаять различие между обектами а callback эту информацию не представляет
В данном случае
Здравствуйте, XuMuK, Вы писали:
XMK>тут все серьёзнее, т.к. нельзя менять интерфейс длл, можно выкрутится например так (главное учесть все возможные грабли, начиная от инициализации статических объектов и заканчивая потокобезопасностью):
XMK>