Hi Leute, ich habe eine dll welche ein embedded python startet. Es wird ein modul erstellt (also ein internes) welches folgende funktion anbietet:
PyObject* registerHandler( PyObject*, PyObject* args )
{
char* handler_name;
PyObject* object;
if( !PyArg_ParseTuple(args, "sO", &handler_name, &object) )
return NULL;
register_handler_function( handler_name, (cast_object_to_funktion_ptr)object );
Py_RETURN_NONE;
}
diese wird dann so aufgerufen (in python):
from ctypes import *
registerHandler( "HandlerName", CFUNCTYPE(None, c_void_p)(test_func1) )
Die Frage ist jetzt: welchen cast muss ich auf object anwenden, damit ich die c-wrapper funktion des objects bekomme?
Python Callbacks in C/C++ registrieren
@Krauzi: Einen *cast* wird es da nicht geben, denn das ist ja eine `PyObject`-Datenstruktur. Vielleicht könntest Du Dir eine Adresse mit `ctypes.adressof()` geben lassen!?
klappt leider auch nicht. Aber die funktion muss ja irgendwo in dem PyObject ptr gespeichert sein, also müsste ich doch irgendwie an den funktions pointer rankommen.
Ich hab schon ein bisschen in der source geguckt, jedoch finde ich keinen funktionierenden zeiger.
EDIT: wuut: Die Lösung liegt eigentlich auf der hand (wenn man in python denkt, nicht aber in c++ [was ich gewohnt bin]), ein *cast* funktioniert anscheinend doch :
Ein cast(func_wrapped, c_void_p).value liefert die exacte addresse der c wrapper funktion
Der Code nochmal funktionierend:
registerHandler( "HandlerName", cast(CFUNCTYPE(None, c_void_p)(test_func1), c_void_p).value )
Ich hab schon ein bisschen in der source geguckt, jedoch finde ich keinen funktionierenden zeiger.
EDIT: wuut: Die Lösung liegt eigentlich auf der hand (wenn man in python denkt, nicht aber in c++ [was ich gewohnt bin]), ein *cast* funktioniert anscheinend doch :
Ein cast(func_wrapped, c_void_p).value liefert die exacte addresse der c wrapper funktion
Der Code nochmal funktionierend:
registerHandler( "HandlerName", cast(CFUNCTYPE(None, c_void_p)(test_func1), c_void_p).value )