コールバックにはconst関数、オブジェクトのメンバーを渡す方法が必要です

StackOverflow https://stackoverflow.com/questions/7372590

質問

より大きな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に単純な関数ポインターを渡す必要がある場合、インスタンス参照を個別に取得し、メンバー関数を自分で呼び出す必要があることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top