[python-win32] Python interpreter crashes after trying to callbacka python function with PyObject_CallObject from a dll

Mark Hammond mhammond at skippinet.com.au
Thu Aug 11 00:45:59 CEST 2005


> static PyObject *my_callback = NULL;
> PyMODINIT_FUNC my_set_callback(PyObject *args)
> {
>           PyObject *temp = args;
>           Py_XINCREF(temp);         /* Add a reference to new callback */
>          Py_XDECREF(my_callback);  /* Dispose of previous callback */
>          my_callback = temp;       /* Remember new callback */
>         Py_INCREF(Py_None);

> bPyCallBackFlag = true;
> };

That looks suspect:
* PyMODINIT_FUNC is probably not what you want - this is not a "module init"
function.
* The first arg is always "self", with "args" being a second arg.
* You Py_INCREF(Py_None), but don't return it.  I'm surprised that compiles.

Let's say "args" was NULL (as it probably will be - recall it is supposed to
be "self", which generally *will* be NULL.  It should be obvious how that
would crash your code.

Also, note that even if you get the correct "args" pointer to that function,
it will be a tuple.  Hence all code you will find uses PyArg_ParseTuple to
get the individual items out.  Your callback will be the first item in the
tuple.

> ppyobjResult = PyObject_CallObject(my_callback, ppyobjArgList);

This will fail for that reason - my_callback will *not* be a callable
object.

I don't think either of the mailing lists you have sent this to are
appropriate - the problems are not releated to win32, not are they related
to C++.  You really just need to look over the documentation on writing
extension modules.

Mark.



More information about the Python-win32 mailing list