2011-07-01 10 views
0

コールバック関数を使用するCライブラリを使用しています。cライブラリのコールバック関数でC++オブジェクトを呼び出す

C++クラスの呼び出しオブジェクトにアクセスできる方法はありますか?

編集:私はCクライアントのlibを使用しています

。 関数はmm_logです。

void mm_log(char* string, long err_flag) 

これは、ライブラリによって内部的に呼び出されています。どのImapストリームが呼び出されているかを確認したい。

詳細 あなたはftp://ftp.cac.washington.edu/imap

+0

このCライブラリでコールバックを取る関数の宣言を提供できますか?コールバックがこのCライブラリでどのように動作するかを示す小さなコード例も役に立ちます。 –

+0

@In Silicoでは、Cクライアントのlibを見てください。 –

+0

@Vivekライブラリ全体ではなく、 'mm_log'のドキュメントにリンクできますか? –

答えて

0

コードからライブラリをダウンロードすることができ、このような問題のために重要です。しかし、あなたのコードを見ることなく、私はまだブランケットステートメントを与えることができます:)

extern "C" 

警告がたくさんありますが、これはその要点です。

このFAQを参照してください:コールバックをしたいhttp://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

+0

私はコールバックが内部的にライブラリから呼び出されているので、私の問題を解決するとは思わない。私は図書館と詳細で質問を更新しました。 –

3

すべて(良い)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); 
} 
+0

@Merlyn Morgan-Graham コールバックがライブラリから内部的に呼び出されているので、それが私の問題を解決するとは思わない。私は図書館と詳細で質問を更新しました。 –

+0

@Vivek:あなたはまだ重要な部分を欠いている:*それはどのようにライブラリによって呼び出されていますか?それをライブラリに渡すことが必要です。 – Xeo

+0

これはIMAP Cライブラリです。 私はそれを のように呼びます。imap_stream_ = mail_open(imap_stream _、 "mailboxnamestring"、NIL); その後、私は のようなすべての呼び出しを使用します。mail_ping mail_uid mail_msgno 呼び出しはライブラリから呼び出されます。 エラーが発生した場合、mm_logはライブラリによって呼び出されます。同様に、tcpタイムアウトです。 –

1

mm_logはあなたが実装している機能であり、ライブラリが(ちなみに、コールバックを行うためのライブラリのひどい道である)を呼び出すされている場合、あなたはそれを得ることができる方法はありませんあなたのクラスのメンバ関数を参照する。

あなたができることは、ライブラリを呼び出す前にオブジェクトを指すように設定してグローバル変数を使用してから、mm_logの中で使用して目的のメソッドを呼び出します。これは厄介で危険ですが、うまくいくことができます。

スレッドが複数ある場合は、非常に注意してください。

+0

はい。ライブラリがプロトタイプを与えている関数で、実装している場合はmm_log。 –

関連する問題