python 3.9 x64 ctypes通过引用char **传递char指针OSError:异常:访问冲突读取0xFFFFFFFFFFFFFFFF

问题描述

首先 这在x32 python中完美地工作,但在x64 python中失败,并出现以下错误

OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF

我有一个用C ++编写的hello.dll,它可以导出以下函数

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;
}

然后我使用以下代码从Python 3.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的所有相关问题

提前感谢大家!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)