コールバックにはconst関数、オブジェクトのメンバーを渡す方法が必要です
-
28-10-2019 - |
質問
より大きなGTKMM/C ++アプリケーションでWebKitgtk+を使用しています。 JavaScriptCoreを使用して、WebKitWebFrameとJSContextと対話しています。
JavaScript関数が呼び出されたときにGTK GUIコンポーネントと対話する必要があるため、私は今立ち往生しています。この目的のために、私はそれを見つけました jsobjectmakefunctionwithcallback 関数。
JSStringRef str = JSStringCreateWithUTF8CString("ClickCallback");
JSObjectRef func = JSObjectMakeFunctionWithCallback(m_jsRef, str, ClickCallback);
JSObjectSetProperty(m_jsRef, JSContextGetGlobalObject(m_jsRef), str, func, kJSPropertyAttributeNone, NULL);
JSStringRelease(str);
ここで、コールバックはdef:の静的関数として定義する必要があります。
static JSValueRef ClickCallback(JSContextRef ctx, JSObjectRef func, JSObjectRef self, size_t argc, const JSValueRef argv[], JSValueRef* exception)
そのため、操作する必要があるGUIコンポーネントに戻るためにコールバックにオブジェクトインスタンスが必要であることを除いて、すべてが機能しています。
SOには同様の質問がたくさんありますが、ほとんどの場合、オブジェクトインスタンスをコールバックに渡すことに焦点を当てています。このAPIでそれを行う方法を見ることができません。
何か案は?
解決
コールバックは無料の機能へのポインターである必要があるため、メンバー関数を直接渡すことができない魔法はありません。一般的な解決策の1つは、オブジェクトインスタンスを保持する中間グローバルな自由関数を作成することです。
JSValueRef ClickCallback(...)
{
Foo & obj = getInstance(); // implement this somehow
return obj.click(...);
}
または、これをGUIクラスの静的なメンバー関数にすることもできます。主なポイントは、APIに単純な関数ポインターを渡す必要がある場合、インスタンス参照を個別に取得し、メンバー関数を自分で呼び出す必要があることです。
所属していません StackOverflow