1

大規模な 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 でそれを行う方法がわかりません。

何か案は?

4

1 に答える 1

4

コールバックはフリー関数へのポインターである必要があるため、いくら魔法をかけてもメンバー関数を直接渡すことはできません。一般的な解決策の 1 つは、オブジェクト インスタンスを保持する中間グローバル フリー関数を作成することです。

JSValueRef ClickCallback(...)
{
  Foo & obj = getInstance(); // implement this somehow
  return obj.click(...);
}

または、これを GUI クラスの静的メンバー関数にすることもできます。要点は、API に単純な関数ポインターを渡す必要がある場合は、インスタンス参照を個別に取得し、メンバー関数を自分で呼び出す必要があるということです。

于 2011-09-10T15:21:05.853 に答える