2011-09-10 55 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

相關問題