2016-10-08 3 views
0

globalObjectにアクセスする方法callbackFunctionでアクセスできますか?サードパーティ製のライブラリから呼び出されるコールバック関数内でオブジェクト/変数にアクセスする/渡す方法は?

私はlibraryFunctionの方法を持つサードパーティライブラリlibrary.hを使用しています。 libraryFunctionの出力はlibraryFunctionOutputで、コールバック関数callbackFunctionに渡されます。

コールバック関数callbackFunctionで別のオブジェクト(例:globalObject)を渡す方法を教えてください。

残念ながら、第三者のライブラリがコンパイルされているため、変更することはできません。ドキュメントで

#include <stdio.h> 
#include "library.h" 

int callbackFunction(int libraryFunctionOutput): 
    printf("%s, %d", libraryFunctionOutput, globalObject); 
    return 1; 

int main(int argc, char* argv[]) 
{ 
    int globalObject = 0; 
    libraryFunction(callbackFunction); 
} 

として、関数が示されています:MathrelCallback構造体は以下のように定義されて

int __stdcall libraryFunction(const char* filename, 
           unsigned int flags, 
           int   userID, 
           MathrelCallback callbackFunction); 

struct MathrelCallback {MathrelHeader header; 
         MathrelInfo data; 
         unsigned int Type; 
}; 
+4

'libraryFunction'の署名は何ですか?それがラムダを受け入れるなら、答えは簡単です。グローバル変数に 'globalObject'をコピーする以外は、関数ポインタだけを受け入れることができるかどうかわかりません。 – Franck

+0

ほとんどのCスタイルのAPIもコンテキストポインタを渡します。あなたは文脈のためにそれを使うべきです。 – krzaq

+0

@Franckドキュメントでライブラリの外観を追加しました。私はラムダを受け入れないと思う。グローバル変数のglobalObjectは、比較的小さなアプリケーションなので、私は満足しています。 @krzaq残念ながら他のコンテキスト引数は 'libraryFunction'以外には渡されず、それ以外のコールバック関数は使用できません。 –

答えて

1

ライブラリが実際に関数ポインタを取る場合(ありませんstd :: functionのような一般化されたCallable)、コールバックにコンテキストやユーザーポインタを渡す機能を持たない場合は、グローバルオブジェクトをグローバルにする必要がありますs):

#include <stdio.h> 
#include "library.h" 

static int globalObject = 0; 

int callbackFunction(int libraryFunctionOutput) 
{ 
    printf("%s, %d", libraryFunctionOutput, globalObject); 
    return 1; 
} 

int main(int argc, char* argv[]) 
{ 
    libraryFunction(callbackFunction); 
} 
+0

これはコンパイルできますか?私は小さな事例を作ろうとしており、何かが欠けているはずです。 ':'は場所が違って見えますか? – wally

+0

'int main(int argc char * argv [])'を 'int main(int argc、char * argv [])'に変更してみてください。 –

+0

ああ、ちょうどコピーし、元のコードを編集し、エラーに気付かなかった。 – Horstling

関連する問題