C++ python 3.9 x64 ctypes通过引用传递字符指针(字符**)错误:异常:访问冲突读取0xFFFFFFFFFFFFFF

C++ python 3.9 x64 ctypes通过引用传递字符指针(字符**)错误:异常:访问冲突读取0xFFFFFFFFFFFFFF,c++,python-3.x,char,pointer-to-pointer,byref,C++,Python 3.x,Char,Pointer To Pointer,Byref,首先 这在x32 python中非常有效,但在x64 python中失败,出现以下错误 OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF 我获得了 hello,dll ,用C++编写,导出以下函数< /p> int __stdcall GetMessage(char **pMsgContainer) { if (!pMsgContainer) return -1; if (*pMsgContainer

首先 这在x32 python中非常有效,但在x64 python中失败,出现以下错误

OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF
<>我获得了 hello,dll <代码>,用C++编写,导出以下函数< /p>
int __stdcall GetMessage(char **pMsgContainer)
{
    if (!pMsgContainer) return -1;
    if (*pMsgContainer) return -2;
    *pMsgContainer = NULL;
    
    char* msg = "Hello world!";
    
    size_t nLen = strlen(msg);
    *pMsgContainer = new char[nLen + 1];
    strncpy((*pMsgContainer), msg, nLen);
    (*pMsgContainer)[nLen] = 0;
    
    return 0;
}
我使用以下代码从Python3.9调用它

import ctypes

dll = ctypes.WinDLL(r"D:\path-to\hello.dll")
GetMessage = dll.GetMessage

GetMessage.argtypes = [ctypes.POINTER(ctypes.c_char_p)]
GetMessage.restype = ctypes.c_int

pBuf = ctypes.c_char_p()
res = GetMessage(ctypes.byref(pBuf))

if (res == 0) :
    print ("Message:", pBuf.value)
else :
    print ("Error:", res)

我编译了DLL(32和64位)的两个版本,并用C++中的测试程序对它们进行了测试,并确认它们都是按预期工作的。

下面是C++代码来运行它,我确认它对于32和64位DLL版本

都是完美的。
char *pBuf = NULL;
int res = GetMessage(&pBuf);
如前所述,这在32位python中可以完美地工作,但在64位python中无法工作

我在这件事上花了两天时间,已经检查了stackoverflow的所有相关问题


提前谢谢大家

if(*pMsgContainer)返回-2您正在取消引用一个单元化的pointer@Jean-Françoisfab如何在python中初始化指针?我已经添加了一个C++代码,以显示如何从C++控制台调用它。executable@LPVOID
pBuf
在Python中被初始化为空指针。我还可以在Python3.6中编译和运行这个程序。在C++中用<代码> LoadLibrary 和<代码> GePosiTrave<代码>代替隐式测试linking@Artyer是否编译了dll x64?@LPVOID是(
static_assert(sizeof(void*)==8)
已通过,所以我确定)。使用指针的东西也很少:
*pMsgContainer=…
strlen(msg)
newchar[nLen+1]
strncpy(newchar[nLen+1],…)
(new char[nLen+1])[nLen]=0
。请尝试查看导致访问冲突的确切指针。您还可以检查python是否也是64位的,并且
ctypes.sizeof(ctypes.c\u char\u p)==8