微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。