Python 3.2.2 ctypes.Structure将c_void_p初始化为None

时间:2012-06-29 23:53:21

标签: ctypes python-3.2

一个简单的类在32位Windows 7上产生这种奇怪的行为。我试图将这个结构的数组传递给我的dll然后尝试获取由dll填充的数据包的内容。当我创建这个类的对象时,我发现c_void_p是一个NoneType对象。这是正常行为吗?

import ctypes
class io_packet( ctypes.Structure ):
    _fields_ = [( 'size', ctypes.c_uint32 ),
                ( 'header', ctypes.c_uint32 ),
                ( 'string1_size', ctypes.c_uint32 ),
                ( 'string2_size', ctypes.c_uint32 ),
                ( 'string1', ctypes.c_char * 128 ),
                ( 'string2', ctypes.c_char * 64 ),
                ( 'virt_handle', ctypes.c_void_p ), ]

a = io_packet()
a.size
a.header
a.string1_size
a.string2_size
a.string1
a.string2
a.virt_handle

1 个答案:

答案 0 :(得分:0)

是的,这很正常。 sizeheader被初始化为零,因此virt_handle初始化为None并不奇怪,这相当于Python中指针的NULL。从Python读取结构元素时,ctypes返回Python

另一个例子:

>>> a=c_void_p()
>>> a
c_void_p(None)
>>> a.value
>>> type(a.value)
<type 'NoneType'>
>>> a=c_void_p(1)
>>> a
c_void_p(1)
>>> a.value
1
>>> type(a.value)
<type 'int'>