gpt4 book ai didi

Python:ctypes加载的dll是否共享相同的内存空间

转载 作者:行者123 更新时间:2023-11-30 04:58:26 27 4
gpt4 key购买 nike

我正在尝试用 Python 中的 dll 做一些我知道我可以用 C++ 做的事情,但是我遇到了内存异常。

如果你在 C++ 中加载两个 dll 并为它们提供相同的指针,它们都可以毫无问题地操作指针指向的对象。

当使用 Python 和 cytypes 做同样的事情时,创建对象的 dll 绝对可以在后续调用中取消引用该指针,因此在 Python 和 C++ dll 之间传递该指针工作正常 .但是,当以相同方式将此指针提供给第二个 dll 时,我得到一个非常无意义的异常:“WindowsError:异常:读取 0x0101CC84 的访问冲突”

ctypes dlls viewed in the debugger

在我开始尝试调试这些 dll 之前(这会很痛苦),有谁知道 Python 是否将这些 C++ dll 加载到相同的内存空间?

最佳答案

是的,python.exe就是进程,所有的DLL都加载到它的内存空间。

你可能有你的 .argtypesrestype声明不正确(或根本没有)。这是一个有效的示例:

x.c

__declspec(dllexport) const char* func1()
{
return "hello";
}

y.c

#include <stdio.h>

__declspec(dllexport) void func2(const char* s)
{
printf("%s\n",s);
}

python

>>> from ctypes import *
>>> x = CDLL('x')
>>> x.func1.argtypes = None
>>> x.func1.restype = c_void_p
>>> y = CDLL('y')
>>> y.func2.argtypes = [c_void_p]
>>> y.func2.restype = None
>>> s = x.func1()
>>> hex(s)
'0x7ff8b4ca8000'
>>> y.func2(s)
hello

注意我明确声明了参数c_void_p因为ctypes将转换 c_char_p输出到 Python 字符串,从 Python 字符串到 char*在输入上,因此它不能证明同一个指针可以从一个 DLL 传递到另一个。

类似SysInternals Process Explorer 的工具可用于查看进程空间中的 DLL:

Process Explorer showing Python.exe and DLLs

请注意 x.func1() 返回的地址属于 x.dll 的映射范围内和 y.func2(s)正确显示。

关于Python:ctypes加载的dll是否共享相同的内存空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51667821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com