Passing DLL handle as an argument (in Windows)

Ulrich Eckhardt ulrich.eckhardt at dominolaser.com
Fri Nov 18 09:14:56 EST 2011


Am 18.11.2011 12:49, schrieb Pekka Kytölä:
> What I'd like to do is that after fetching those SDK function
> pointers I'd like to fire up .py/.pyc that snoops for possible
> plugins written in python and registers those plugins and callbacks
> and let them react to events. Obviously this python code needs access
> to those SDK functions. Essentially it would show for the host app as
> one .dll but registers multiple plugins from different python files.

Okay, so you want to export functions from your host application (it 
doesn't matter if that is inside a DLL or not) to a bunch of Python 
plugins. This is actually the embedding that I hinted at and documented, 
but here's some example code (stripped of any error handling and 
reference counting, so beware!):

// append line to debug log
static PyObject*
log_string(PyObject *self, PyObject *args)
{
     char const* arg = 0;
     if(!PyArg_ParseTuple(args, "s", &arg))
         return NULL;

     fprintf(debug_output, "%s", arg);
     Py_RETURN_NONE;
}

// exported API
static PyMethodDef host_api[] =
{
     {"log_string", log_string, METH_VARARGS,
         "log_string(string) -> None\n"
         "Write text to debug output."},
     {NULL, NULL, 0, NULL}
};

Py_Initialize();
PyObject* host_api_module = Py_InitModule("host", host_api);
PyObject* test_module = PyImport_ImportModule("./test.py");
PyObject* main_function = PyObject_GetAttrString(test_module, "main");
PyObject* res = PyObject_CallObject(main_function, NULL);
Py_Finalize();


This has the disadvantage that it blocks, for multiple Python threads, 
you need to program a dispatcher. Also, you can only have a single 
interpreter loaded, so other parts of your program may not call 
Py_Initialize().

It does the job for my uses, so I hope it helps!

Uli



More information about the Python-list mailing list