在DLL中嵌入Python:在Py_DECREF list对象时访问冲突读取位置
我试图将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对象(一个浮点或一个列表),然后减少引用计数在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
#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};i Py_DECREF(obj);//您正在编译和链接哪个版本的Python?您确定在Excel运行时中选择了正确的Python DLL吗?