F
fabien.lyon
-----Message d'origine-----
De : fabien.lyon [mailto:[email protected]]
Envoyé : mercredi 30 mai 2007 20:16
À : '(e-mail address removed)'
Objet : RE: embeded python progam into visual C++ application crash
2.5.1 is compiled with Visual Studio 2005 - I hope you had no problems
with VC++ 6.0?
Ho sorry you are right (this pb disturbs me too much).
Investigation and efforts has been helpfull, so we have found the problem.
This is the following description :
void InterfaceTestConfigPython_C::InitCVS(CString path_vue_bench_p, CString
path_vue_test_p)
{
PyObject *pArgs= NULL, *pValue= NULL;
PyObject *pPathVueBench= NULL, *pPathVueTest= NULL ;
//python objects for each python function argument
pPathVueBench = PyString_FromString((LPCTSTR)path_vue_bench_p);
pPathVueTest = PyString_FromString((LPCTSTR)path_vue_test_p);
//python object to collect all arguments
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, pPathVueBench);
PyTuple_SetItem(pArgs, 1, pPathVueTest);
// python function call
pValue = PyObject_CallObject(pFuncInit_m, pArgs);
// clean up memory
Py_DECREF(pArgs);
// process return value
if (pValue != NULL)
{
....
// clean up memory
Py_DECREF(pValue);
}
// clean up memory
Py_DECREF(pPathVueBench );
Py_DECREF(pPathVueTest);
}
The problem we get come from a wrong code. The last two lines, calling
Py_DECREF, are not mandatory and make the python interpreter in a bad day.
When the InitCVS() function call Py_DECREF(pArgs) the memory allocated for
pPathVueBench and pPathVueTest is free (i guess) because the
PyTuple_SetItem(pArgs, 0, pPathVueBench) steals the reference of the python
object you add into the tuple pArgs like the python documentation tells. So
we have suppressed the last clean up memory
in the InitCVS() function and now the program is running as expected.
I join the C++ object code if this can help someone.
De : fabien.lyon [mailto:[email protected]]
Envoyé : mercredi 30 mai 2007 20:16
À : '(e-mail address removed)'
Objet : RE: embeded python progam into visual C++ application crash
hello,
The C++ application uses a python module which wraps commands set for CVS
management:
checkout, checkin and tag.
We used python2.5.1 and Visual C++ 6.0
2.5.1 is compiled with Visual Studio 2005 - I hope you had no problems
with VC++ 6.0?
The problem we get is:
After a good import and definition of python functions we have a random
unhandled exception (from python25.dll) when calling python interface
function several times.
All the python module has been tested using the python IDLE.
This the C++ sequence code we used:
Py_initialize()
Py_Import("moduleName")
cvs_init() // cvs view initialisation handled
by
python script init()
cvs_set_tag() // cvs commit and tag handled by python
script settag()
// the exception occured here
Ho sorry you are right (this pb disturbs me too much).
Investigation and efforts has been helpfull, so we have found the problem.
This is the following description :
void InterfaceTestConfigPython_C::InitCVS(CString path_vue_bench_p, CString
path_vue_test_p)
{
PyObject *pArgs= NULL, *pValue= NULL;
PyObject *pPathVueBench= NULL, *pPathVueTest= NULL ;
//python objects for each python function argument
pPathVueBench = PyString_FromString((LPCTSTR)path_vue_bench_p);
pPathVueTest = PyString_FromString((LPCTSTR)path_vue_test_p);
//python object to collect all arguments
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, pPathVueBench);
PyTuple_SetItem(pArgs, 1, pPathVueTest);
// python function call
pValue = PyObject_CallObject(pFuncInit_m, pArgs);
// clean up memory
Py_DECREF(pArgs);
// process return value
if (pValue != NULL)
{
....
// clean up memory
Py_DECREF(pValue);
}
// clean up memory
Py_DECREF(pPathVueBench );
Py_DECREF(pPathVueTest);
}
The problem we get come from a wrong code. The last two lines, calling
Py_DECREF, are not mandatory and make the python interpreter in a bad day.
When the InitCVS() function call Py_DECREF(pArgs) the memory allocated for
pPathVueBench and pPathVueTest is free (i guess) because the
PyTuple_SetItem(pArgs, 0, pPathVueBench) steals the reference of the python
object you add into the tuple pArgs like the python documentation tells. So
we have suppressed the last clean up memory
in the InitCVS() function and now the program is running as expected.
I join the C++ object code if this can help someone.