La devolución de llamada requiere la función const, cómo pasar el miembro de la instancia del objeto

StackOverflow https://stackoverflow.com/questions/7372590

Pregunta

Estoy usando WebKitGTK+ en una aplicación GTKMM/C ++ más grande. Estoy usando JavaScriptCore para interactuar con WebKitWebFrame y JScontext dentro.

Estoy atascado ahora, ya que necesito interactuar con un componente GTK GUI cuando se llama a una función JavaScript. Para este fin encontré el JSObjectMakeFunctionWithCallback función.

JSStringRef str = JSStringCreateWithUTF8CString("ClickCallback");
JSObjectRef func = JSObjectMakeFunctionWithCallback(m_jsRef, str, ClickCallback);
JSObjectSetProperty(m_jsRef, JSContextGetGlobalObject(m_jsRef), str, func, kJSPropertyAttributeNone, NULL);
JSStringRelease(str);

Donde la devolución de llamada debe definirse como una función estática con DEF:

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

Entonces, todo funciona, excepto que necesito mi instancia de objeto en la devolución de llamada para volver al componente GUI que necesito manipular.

Hay toneladas de preguntas similares sobre, pero la mayoría se centra en pasar la instancia del objeto a la devolución de llamada. No puedo ver una forma de hacer eso con esta API.

¿Algunas ideas?

¿Fue útil?

Solución

Se requiere que la devolución de llamada sea un puntero a una función gratuita, por lo que ninguna cantidad de magia puede lograr que pase una función de miembro directamente. Una solución común es hacer una función libre global intermedia que contenga la instancia del objeto:

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

Alternativamente, puede hacer de esta una función de miembro estático de su clase GUI. El punto principal es que debe obtener la referencia de instancia por separado y llamar a la función miembro usted mismo si tiene que pasar un puntero de función simple a su API.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top