[C++-sig] How to use boost.python to wrap a class with a pure virtual function that has a 'void *' argument

James Whetstone jameswhetstone at comcast.net
Sat Mar 22 21:57:31 CET 2008


I'm new to Python and Boost.python and 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



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20080322/3fe53fa8/attachment.htm>


More information about the Cplusplus-sig mailing list