我正在尝试使用Python中的dll做一些事情,我知道我可以在C ++中完成,但是我遇到了内存异常。
如果在C ++中加载两个dll并为其提供相同的指针,则它们都可以在指针指向的对象上进行操作,而不会出现问题。
在使用Python和cytypes进行相同操作时,创建对象的dll在后续调用中完全引用该指针是完全可以的,因此因此在Python和C ++ dll之间传递该指针是可以正常工作的 。但是,当以相同方式将此指针提供给第二个dll时,我得到了一个非常无意义的异常:“ WindowsError:异常:访问冲突读取0x0101CC84”。。
在我开始尝试调试这些dll(这会很痛苦)之前,有人知道Python是否将这些C ++ dll加载到相同的内存空间中吗?
答案 0 :(得分:1)
是的,python.exe是该进程,所有DLL均已加载到其内存空间中。
您可能.argtypes
和restype
的声明不正确(或根本没有声明)。这是一个可行的示例:
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:
请注意,x.func1()
返回的地址在x.dll
的映射范围内,并且y.func2(s)
正确显示了该地址。