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

回调必须是指向自由函数的指针,所以再多的魔法也无法让您直接传递成员函数。一种常见的解决方案是创建一个包含对象实例的中间全局自由函数:

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

或者,您可以将其设为 GUI 类的静态成员函数。要点是,如果必须将普通函数指针传递给 API,则必须单独获取实例引用并自己调用成员函数。

于 2011-09-10T15:21:05.853 回答