我在Windows上使用Python ctypes库并实现OVERLAPPED结构。它有2个ULONG_PTR类型的成员,在ctypes.wintypes中不可用。根据{{3}} ULONG_PTR是ULONG,它取决于指针大小。我可以在Python中使用wintypes.ULONG而不是ULONG_PTR,还是有更好的方法?
我发现了OVERLAPPED结构的几种不同实现:Microsoft POINTER(ULONG))而不是ULONG_PTR和here - LPVOID。但是ULONG_PTR不是指针,所以恕我直言这些不是正确的类型。我错了吗?我尝试了LPVOID并且它有效,但我不是C家伙,所以我想知道我的情况有什么不同吗?
答案 0 :(得分:3)
使用c_void_p
或LPVOID
。这将是指针的大小,实际类型并不重要,因为您永远不会访问Internal
和InternalHigh
成员。
使用POINTER(ULONG)
可行,但POINTER(c_char)
或任何其他指针类型也可以。类型仍然是错误的,除非您现在正在分配一个您实际上并不需要的新类型对象。
如果您需要使用他们的"正确的"访问内部成员。然后,根据您是否使用32位或64位版本的Python,您需要定义两种不同的OVERLAPPED结构中的一种。类似的东西:
if ctypes.sizeof(ctypes.c_void_p) == 8:
ULONG_PTR = ctypes.u_longlong
else:
ULONG_PTR = ctypes.u_long
class OVERLAPPED(ctypes.Structure):
_fields_ = [("Internal", ULONG_PTR),
("InternalHigh", ULONG_PTR),
...]