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

2024-09-28 23:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python做DLL,我知道我可以在C++中做,但是我得到了内存异常。你知道吗

如果在C++中加载两个DLL并为它们提供相同的指针,则它们都可以对指针指向的对象进行操作,而不会出现问题。你知道吗

使用Python和Cype进行相同操作时,创建对象的DLL在后续调用中绝对是对指针的取消引用,,因此指针在Python和C++ DLL之间的传递工作正常。然而,当这个指针以同样的方式提供给第二个dll时,我得到了一个非常不具信息性的异常:“WindowsError:exception:access invalization reading 0x0101CC84”。你知道吗

ctypes dlls viewed in the debugger

在我开始调试这些DLL(这将是痛苦的)之前,有人知道Python是否将这些C++ DLL加载到相同的内存空间中?你知道吗


Tags: 对象内存access方式exception信息性指向dll
1条回答
网友
1楼 · 发布于 2024-09-28 23:17:07

是的,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传递到另一个DLL。你知道吗

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

Process Explorer showing Python.exe and DLLs

注意,x.func1()返回的地址在x.dll的映射范围内,y.func2(s)正确地显示了它。你知道吗

相关问题 更多 >