在IronPython 2.7.9中,我需要将c_char_p
设置为绝对地址0xCAFEBABE
。此“地址”将不是是要读取的有效内存地址,但它是触发某些内容的不可思议的词(您可以阅读为什么我必须使用char *而不包含内容的背景知识“ How do I set an IronPython ctypes c_char_p pointer to an absolute address manually?”处的问题,其中原始问题不足以解决我的问题)。另外,由于我必须加载32位DLL,因此只能使用IronPython解释器的32位版本。
from ctypes import *
class MyStruct(Structure):
_fields_ = [("config", c_char_p),
("magicnumber", c_char_p)]
mystruct = MyStruct()
mystruct.config = "my RS232 configuration"
mystruct.magicnumber = cast(0xCAFEBABE, c_char_p)
不幸的是,最后一个作业引发了OverflowError
。
其他Python实现(CPyhton 2.x,CPython 3.x,PyPy和ActivePython,...)可以完成此任务。
属性magicnumber
的分配应该做的是,Python解释器应将32位地址0xCAFEBABE
写到结构内部指针的正确内存地址中(除IronPython可以做到)。
IronPython与.NET框架的紧密结合使IronPython对于许多希望与其他.NET语言结合使用的开发人员很有趣。
IronPython可能无法完成此任务吗? 我很高兴对此有一个可靠的答案。 预先谢谢你!
答案 0 :(得分:0)
要获得针对所有Python实现的此问题的整体解决方案,我们不应该不将结构属性声明为其原始类型c_char_p
,而应声明为c_uint
。
这意味着将对此属性的访问包装到必须处理已修改类型的处理函数中。
对该属性的写访问(使用字符串作为参数)必须分配一个适当的缓冲区并将该字符串存储到缓冲区中。
然后将缓冲区的地址写入此c_uint
属性。带有特殊标志0xCAFEBABE
的写访问可以直接写入属性的新c_uint
类型。
读取访问应仅返回缓冲区的内容,因为通过此属性将数据传输到Python代码中并不适用于此属性。
这已被验证并且可以正常工作。