为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2021-05-07 14:58:01
我正在尝试使用Python中的dll做一些事情,我知道我可以在C ++中完成,但是我遇到了内存异常。如果在C ++中加载两个dll并为它们提供相同的指针,则它们都可以在指针指向的对象上进行操作而不会出现问题。当使用Python和cytypes进行相同操作时,创建对象的dll在后续调用中取消引用该指针是绝对好的,因此在Python和C ++ dll之间传递该指针可以正常工作。但是,当以相同方式将此指针提供给第二个dll时,我得到了一个非常无意义的异常:“ WindowsError:异常:读取0x0101CC84的访问冲突”。在我开始尝试调试这些dll(这会很痛苦)之前,有人知道Python是否将这些C ++ dll加载到相同的内存空间中吗?
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

是的,python.exe是该进程,所有DLL均已加载到其内存空间中。


你可能对您.argtypes和restype声明不正确(或根本不)。这是一个有效的示例:


c


__declspec(dllexport) const char* func1()

{

    return "hello";

}

yc


#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在输出时将a转换为Python字符串,并char*在输入时将其从Python字符串转换为输入,因此无法证明同一指针可以从一个DLL传递到另一个DLL。


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

//img1.sycdn.imooc.com//60a37e4200018fcb12120315.jpg

请注意,由返回的地址x.func1()在的映射范围内,x.dlly.func2(s)可以正确显示。


查看完整回答
反对 回复 2021-05-18
  • 1 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信