Вызов объекта c ++ в функции обратного вызова библиотеки c - PullRequest
0 голосов
/ 01 июля 2011

Я использую библиотеку C, которая использует функции обратного вызова.

Есть ли способ получить доступ к вызывающему объекту класса C ++?

Edit:

Я использую c-client lib. Которые имеют функцию mm_log.

 void mm_log(char* string, long err_flag)

, который внутренне вызывается библиотекой. Я хочу проверить, какой поток Imap вызывается.

Подробнее Вы можете скачать библиотеку с ftp: //ftp.cac.washington.edu/imap

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Все (хорошие) библиотечные функции C, которым требуется обратный вызов, имеют указатель void* user_data как часть функции и параметр обратного вызова. Вы просто передаете указатель на свой объект, как этот, в функцию, и он просто возвращается вам в обратном вызове. Пример:

typedef void (*callback)(void*);

void dumb_api_call(callback cb, void* user_data){
  cb(user_data);
}

struct Foo{};

void my_callback(void* my_data){
  Foo* my_foo = static_cast<Foo*>(my_data);
}

int main(){
  Foo my_foo;
  dumb_api_call(my_callback, &my_foo);
}
1 голос
/ 01 июля 2011

Если mm_log - это функция, которую вы реализуете, и библиотека вызывает (кстати, это ужасный способ для библиотеки выполнять обратные вызовы), то вы не сможете заставить ее ссылаться на членфункция в вашем классе.

То, что вы могли бы сделать, это использовать глобальную переменную, которую вы установили для указания на ваш объект, прежде чем вызывать библиотеку (и очищать после), а затем использовать ее в mm_log для вызова нужного метода.,Это противно и опасно, но может сработать.

Если у вас более одного потока, будьте предельно осторожны или найдите лучшую библиотеку.

0 голосов
/ 01 июля 2011

Код важен для такого вопроса.Но, не видя ни одного вашего кода, я все равно могу дать вам общий оператор:)

Вам придется обернуть ваш объект C ++ глобальными функциями, которые обращаются к простой старой структуре, и экспортировать их с помощью:

extern "C"

Существует множество предостережений, но в этом суть.

См. Этот FAQ: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

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