Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在DLL中嵌入Python:在Py_DECREF list对象时访问冲突读取位置_Python_C++_Excel_Dll_Xll - Fatal编程技术网

在DLL中嵌入Python:在Py_DECREF list对象时访问冲突读取位置

在DLL中嵌入Python:在Py_DECREF list对象时访问冲突读取位置,python,c++,excel,dll,xll,Python,C++,Excel,Dll,Xll,我试图将Python嵌入到XLL中,以允许在Excel中调用Python函数。XLL是一个DLL,它至少包含2个函数,告诉Excel如何从DLL中注册或取消注册导出的函数,因此可以将其完全视为传统DLL。我遇到的问题是,当减少Python列表对象的引用计数时,程序会崩溃,并出现以下错误: EXCEL.EXE中0x1E14E37D(python37.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000064 当减少引用计数字符串、浮点数、bool等时,我没有这个问题。只有lis

我试图将Python嵌入到XLL中,以允许在Excel中调用Python函数。XLL是一个DLL,它至少包含2个函数,告诉Excel如何从DLL中注册或取消注册导出的函数,因此可以将其完全视为传统DLL。我遇到的问题是,当减少Python列表对象的引用计数时,程序会崩溃,并出现以下错误:

EXCEL.EXE中0x1E14E37D(python37.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000064

当减少引用计数字符串、浮点数、bool等时,我没有这个问题。只有list和tuple对象给了我这个问题

下面我给出了一个简单的示例,其中有两个函数暴露于Excel、testFloat和testList中。这两个函数都非常容易尝试和调试问题,因此函数不带参数,都将xltypenil返回Excel,这将用0填充单元格。每个函数都创建自己的Python对象(一个浮点或一个列表),然后减少引用计数

#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <Windows.h>
#include <XLCALL.H>
#include <FRAMEWRK.H>

LPCWCHAR uFuncs[][3]{
    {L"testFloat", L"Q", L"testFloat"},
    {L"testList", L"Q", L"testList"},
};

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

int WINAPI xlAutoOpen(void) {
    if (!Py_IsInitialized()) {
        Py_InitializeEx(0);
    }

    // register functions with Excel
    XLOPER12 xDLL;
    Excel12f(xlGetName, &xDLL, 0);
    for (int i{ 0 }; i < sizeof(uFuncs) / sizeof(uFuncs[0]); i++) {
        Excel12f(xlfRegister, 0, 4,
            (LPXLOPER12)& xDLL,
            (LPXLOPER12)TempStr12(uFuncs[i][0]),
            (LPXLOPER12)TempStr12(uFuncs[i][1]),
            (LPXLOPER12)TempStr12(uFuncs[i][2])
        );
    }
    Excel12f(xlFree, &xDLL, 0);

    return 1;
}

int WINAPI xlAutoClose(void) {
    if (Py_IsInitialized()) {
        Py_FinalizeEx();
    }
    return 1;
}

LPXLOPER12 testFloat(void) {
    static XLOPER12 xRet;
    PyObject* obj{ PyFloat_FromDouble(2.5) };
    Py_DECREF(obj);
    xRet.xltype = xltypeNil;
    return &xRet;
}

LPXLOPER12 testList(void) {
    static XLOPER12 xRet;
    PyObject* obj{ Py_BuildValue("[dd]", 3.4, 4.5) };
    Py_DECREF(obj);  // <---- This is where the debugger says the error is
    xRet.xltype = xltypeNil;
    return &xRet;
}
#定义PY\u-SSIZE\u-T\u-CLEAN
#包括
#包括
#包括
#包括
LPCWCHAR uFuncs[][3]{
{L“testFloat”,L“Q”,L“testFloat”},
{L“testList”,L“Q”,L“testList”},
};
BOOL APICENT DllMain(模块HMODULE,
德沃德·乌尔打电话的理由,
LPVOID lpReserved
)
{
开关(ul\u呼叫原因\u)
{
案例DLL\u进程\u附加:
案例DLL\u线程\u连接:
案例DLL\u线程\u分离:
案例DLL\u进程\u分离:
打破
}
返回TRUE;
}
int WINAPI xlAutoOpen(无效){
如果(!Py_已初始化()){
Py_初始值(0);
}
//在Excel中注册函数
xl12-xDLL;
Excel12f(xlGetName和xdl,0);
对于(inti{0};iPy_DECREF(obj);//您正在编译和链接哪个版本的Python?您确定在Excel运行时中选择了正确的Python DLL吗?