[C++-sig] call_method crash

Gustavo Adolfo Borges gustavoborges at rjxcapital.com
Thu Oct 8 21:44:26 CEST 2009


Since Python Win32 lib does not implement DDE Advise Loop and i need it for
a project, i guessed that Boost Python would be a way to integrate the ddeml
lib with my python code. I guessed i could just call call_method inside the
DDE Callback function, but when i do that python crashes. I can't(or couldnt
find how to) add the DDE Callback function to the Python Module and i tried
through a 2 stages call(DdeCallback calls a Python Module function that
call_method) without success. Everything else works great... I can connect
to the DDE Server, the advise loop works, my setPyCallback/getPyCallback
works... I just can't get any python to work on the C++ DDECallback
function.

Here is part of the code
------------------

PyObject* myPythonCallback;
void CallPy(TCHAR SomeValue){
    boost::python::call<void>(myPythonCallback,SomeValue);
}
HDDEDATA CALLBACK DdeCallback(UINT wType,UINT uFmt,HCONV hconv,HSZ hsz1,HSZ
hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2){
..........
    switch (wType) {
            case XTYP_ADVDATA:
                        .................. bunch of code ..........
                        CallPy(mybuffer);
                        return((HDDEDATA)DDE_FACK);
}
int ddeConnect();

void ddeAdvise(TCHAR* topic);

void setCallback(PyObject* p){
    boost::python::call<void>(p,"3");// test calling function and WORKS
    myPythonCallback = p;
}

BOOST_PYTHON_MODULE(extending)
{
    using namespace boost::python;
    def("ddeConnect", ddeConnect);
    def("ddeAdvise", ddeAdvise);
    def("ddeSetCallback", setCallback);
    def("CallPy", CallPy);
}

-------------

Python
------------
import extending
import wx
import justAFrame

def mCB (valor):
    print "mCB",str(valor)
    return float(str(valor))

class MyFrame(justAFrame.MyFrame):
    def initAfter (self):
        justAFrame.MyFrame.initAfter(self)
        extending.ddeConnect()
        extending.ddeSetCallback(mCB)
        extending.CallPy("1") #WORKS
        extending.ddeAdvise("0012PETR4;1")

app = wx.PySimpleApp()
frame=MyFrame(None,title="DDE Test")
app.MainLoop()
--------------


How can i make this DdeCallback to interact with a python function defined
by the user ? Is there a better way to do this ? I'm open to suggestions.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20091008/0dd2769e/attachment.htm>


More information about the Cplusplus-sig mailing list