我在更大的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看到这样做的方法。
有什么想法吗?
答案 0 :(得分:4)
回调必须是指向自由函数的指针,因此没有多少魔法可以让你直接传递成员函数。一个常见的解决方案是创建一个包含对象实例的中间全局自由函数:
JSValueRef ClickCallback(...)
{
Foo & obj = getInstance(); // implement this somehow
return obj.click(...);
}
或者,您可以将其设置为GUI类的静态成员函数。重点是您必须单独获取实例引用,并且如果必须将普通函数指针传递给API,则自己调用成员函数。