使用C ++中的python35.dll进行堆损坏以进行函数调用

时间:2019-06-03 11:37:51

标签: c++ python-3.5 heap-corruption python-embedding

我正在尝试一个非常基本的“ hello world”程序,该程序应该在我的C ++控制台应用程序中嵌入python脚本,但是Visual Studio在Py_XDECREF(pFunc);处检测到堆损坏。

我已经能够为没有定义和返回值的python脚本运行PyRun_SimpleFile(),但是对于我将来的应用程序,我需要一个带有返回值的python函数,因此PyRun_SimpleFile()是不可行的。

基于this Introduction的我的代码是:

main.cpp

#include "stdafx.h"
#include <stdlib.h>
#include <Python.h>

int main(int argc, char *argv[])
{
    Py_SetPythonHome(L"C:/Program Files/Python35");
    Py_Initialize();
    PyObject *pModule;
    PyObject *pFunc, *pValue;

    pModule = PyImport_ImportModule("HelloWorld");

    if (pModule)
    {
        pFunc = PyObject_GetAttrString(pModule, "getInteger");
        if (pFunc && PyCallable_Check(pFunc))
        {
            pValue = PyObject_CallObject(pFunc, NULL);
            printf_s("C: getInteger() = %ld\n", PyLong_AsLong(pValue));
            Py_XDECREF(pValue);
        }
        else
        {
            printf("ERROR: function getInteger()\n");
        }
        Py_XDECREF(pFunc);
    }
    else
    {
        printf_s("ERROR: Module not imported\n");
    }

    Py_XDECREF(pModule);

    Py_Finalize();
    return 0;
}

HelloWorld.py(在我的VS2015解决方案的调试位置中):

def getInteger():
    print('Python function getInteger() called')
    c = 100*2
    return c

我已经尝试过标志_CRTDBG_CHECK_ALWAYS_DF,但是它并没有在堆破坏行中断。

0 个答案:

没有答案