Seite 1 von 1

Python Callbacks in C/C++ registrieren

Verfasst: Mittwoch 15. Dezember 2010, 18:46
von Krauzi
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?

Re: Python Callbacks in C/C++ registrieren

Verfasst: Mittwoch 15. Dezember 2010, 19:48
von BlackJack
@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!?

Re: Python Callbacks in C/C++ registrieren

Verfasst: Mittwoch 15. Dezember 2010, 20:35
von Krauzi
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 )