[C++-sig] Error when trying to embed python into C++

Erin Stone erin.stone at 4DTechnology.com
Wed May 7 22:47:07 CEST 2008


Hi - I'm a newbie to doing this and would appreciate any help /
suggestions. Here's my problem, I have an existing python application
and a 3rd party C++ dll that need to talk to each other. So far I have
been able to follow the "Extending and Embedding Python" tutorial to
create an extension to make the C++ dll available to my python app and
have it (the extension) return back values (ints, strings, etc) to the
python app.

 

The 3rd party dll has one method that I need to use that requires a
callback with a particular signature. My thinking is as follows:

 

1.	create callback method in my python module
2.	create a method in my C++ extension that would take as a
parameter the method from step 1 and store it
3.	create another method in my C++ extension that would act as the
3rd party dll callback with the particular signature
4.	set the method in #3 to be the callback for the 3rd party dll
5.	when the method in #3 is called back to from the 3rd party,
parse the data into appropriate python objects and then call the python
callback  from #2

 

Problem is when I do this, I get a python.exe error and my application
crashes - so any ideas on what I am missing?? I don't have the option of
using boost because this is a legacy application and do cannot introduce
another framework.

 

Again, any help is appreciated!

Thanks,

Erin

 

Here is the code:

 

Python

import wx

import camera_ext  #this is the C++ ext

 

class frmMain(wx.Frame):

    def _init_ctrls(self, prnt):

            #we just initialize the controls on the form here

 

    def __init__(self, parent):

        self._init_ctrls(parent)

    

   def OnInstallHooker(self, event):

        installed = camera_ext.InstallFrameHooker(self._my_frame_hooker)
# is this right? Or should it be a module method, not a method of the
class?

        self.txtData.SetValue("installed hooker: " + str(installed));

        

    def OnStartGrab(self, event):

        started = camera_ext.StartFrameGrab()

        self.txtData.SetValue("started grabbing: " + str(started));

        

 

    def _my_frame_hooker(self):

        # should be called from the c++ ext

        print "I was called"  # this never gets printed out ????

        return True

 

 

 

C++ (camera_ext)

 

 

static void FrameCallBack( TProcessedDataProperty* Attributes, unsigned
char *Frameptr )

{

 

            //once called, we need to package up to return it to python
as an actual object

            

            PyObject *arglist;

            PyObject *result;

 

            printf("foo") //this does print out so I know the 3rdparty
dll (BUFUSB is calling back)

 

            // All frame data is pointed by Frameptr

            // All frame related attributes is in Attributes.

            arglist = Py_BuildValue("i", Attributes->CameraID);

            result = PyObject_CallObject(my_python_callback,arglist);

 

            Py_DECREF(arglist);

 

 

}

 

static PyObject *install_frame_hooker(PyObject *dummy, PyObject *args){

 

int retVal = 0;

            PyObject *result = NULL;

             PyObject *tobj;

            

 

    if (!PyArg_ParseTuple(args, "O:set_callback", &tobj)) 

        return NULL;

    

    // make sure second argument is a function

    if (!PyCallable_Check(tobj)) {

        PyErr_SetString(PyExc_TypeError, "Need a callable object!");

    }

            Py_XINCREF(tobj); /*add a reference to the new callback
instance*/

            Py_XDECREF(my_python_callback); /*dispose of previous
callback instance */

            my_python_callback = tobj;        /*save reference to new
callback instance */

            

            Py_INCREF(Py_None);

            result = Py_None;

            /*now this method must call the camera's SDK
InstallFrameHooker to install 

            the C++ FrameHooker - note that 0 is raw data, 1 is bmp data
*/

                        

            retVal = BUFUSB_InstallFrameHooker(0, FrameCallBack);

 

            return result;

}

 

static PyObject *start_frame_grab(PyObject *self, PyObject *args){

            //starts grabbing data

            int retVal = 0;

 

            //start frame grab will cause camera engine to call on the
frame hooker (callback) method to return camera data

            retVal = BUFUSB_StartFrameGrab(0x8888);        

 

            return Py_BuildValue("i", retVal);

 

}

 

static PyMethodDef camera_ext_methods[] = {

            {"StartFrameGrab", start_frame_grab, METH_VARARGS, "Start
grabbing frames, specify the number of frames to grab"},

            {"InstallFrameHooker", install_frame_hooker, METH_VARARGS,
"Set the callback function to notify caller everytime the camera engine
gets a new frame"},

            {NULL, NULL}

};

 

 

void initcamera_ext(void)

{

    import_array();

    Py_InitModule("camera_ext", camera_ext_methods);

}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20080507/656cedfe/attachment.htm>


More information about the Cplusplus-sig mailing list