I found a solution to this problem:
void handleMessage(void *message) { int size = getSize(message); PyObject *obj = PyBuffer_FromMemory( message, size ) ; boost::python::handle<> h(obj); PyGILState_STATE gstate = PyGILState_Ensure(); try { call<void>(this->get_override("handleMessage").ptr(), h); } catch (const error_already_set) { // Catch and ignore exception that is thrown if Python // onMessage raised an exception. Print it to sys.stderr, // since there is nothing we can do about it here. PyErr_Print(); } PyGILState_Release(gstate); } "James Whetstone" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > As the subject implies, I'm having trouble wrapping a C++ class that looks > like this: > > struct A > { > virtual void handleMessage(void *message)=0; > }; > > > To wrap this class, I've written the following code: > > struct AWrapper : A, wrapper<A> > { > void handleMessage(void *message) > { > this->get_override("handleMessage")(message); > } > }; > > class_<AWrapper, boost::noncopyable>("A") > .def("handleMessage", pure_virtual(&A::handleMessage)) > ; > > > My python test code looks like this: > > import APackage > > class aclass(APackage.A): > def handleMessage(msg) : print msg > > > But this code crashes when the handleMessage function is called in python > (I think) because 'void *' cannot be marshalled. Is there some way around > this? Also, since the void* object is intended to be "zero copy", I > should probably convert the void * to a PyObject first and re-write my > handleMessage to look like this: > > void handleMessage(void *message) > { > int size = getMessageSize(message); > > PyObject *obj = PyBuffer_FromReadWriteMemory(message, size); > > this->get_override("handleMessage")(obj); > } > > Has anyone done this type of thing? I'm writing this code using MS Visual > Studio 8 and if anyone can help, it would *very* appreciated. > > Thanks! > James > > > > -- http://mail.python.org/mailman/listinfo/python-list