C++ python 3.9 x64 ctypes通过引用传递字符指针(字符**)错误:异常:访问冲突读取0xFFFFFFFFFFFFFF
首先 这在x32 python中非常有效,但在x64 python中失败,出现以下错误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
OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF
<>我获得了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@LPVOIDpBuf
在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