2011-09-10 26 views
1

我在更大的GTKmm/C++应用程序中使用WebKitGTK +。我正在使用JavaScriptCore与WebKitWebFrame和JSContext进行交互。回调需要const函数,如何通过对象的实例成员

因为我需要在调用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); 

凡回调必须定义为与高清静态函数:

static JSValueRef ClickCallback(JSContextRef ctx, JSObjectRef func, JSObjectRef self, size_t argc, const JSValueRef argv[], JSValueRef* exception) 

所以一切工作只是我需要在回调我的对象实例中的GUI组件,我需要找回操作。

在SO上有类似的问题,但大多数重点是将对象实例传递给回调函数。我看不到用这种API做这件事的方法。

任何想法?

+0

它不一定是一个静态函数,甚至不是一个成员函数。 –

+2

我讨厌API时让你注册回调而不让你传递某种“上下文”cookie(通常是void *)。 –

+0

@Emile - 的确如此。 V8允许通过将一个特殊的'Data'指针附加到传递给该函数的'Arguments'对象,至少。节省了很多麻烦。 – namuol

回答

4

回调需要是一个指向一个自由函数的指针,所以没有多少魔法可以让你直接传递成员函数。一种常见的解决方案是创建一个中间全局免费函数来保存对象实例:或者,您可以将其设置为GUI类的静态成员函数。重点是您必须单独获取实例引用,如果您必须将简单函数指针传递给API,则自己调用成员函数。

+0

@Kerrek SB,谢谢。这就是我正在进行的。尽管它让它变得更清洁,但我还是希望有一些魔力...... – Mark

相关问题