ULONG_PTR 在 Python 中
ULONG_PTR in Python ctypes
我在 Windows 上使用 Python ctypes 库并实现 OVERLAPPED structure. It has 2 members of ULONG_PTR type that is not available in ctypes.wintypes. According to Microsoft ULONG_PTR 是一个 ULONG,它取决于指针大小。我可以在 Python 中使用 wintypes.ULONG 而不是 ULONG_PTR 还是有更好的方法?
我发现了 OVERLAPPED 结构的几个不同实现:here POINTER(ULONG)) is used instead of ULONG_PTR and here - LPVOID。但是 ULONG_PTR 不是指针,所以恕我直言,这些类型不适合使用。我错了吗?我尝试了 LPVOID 并且它有效,但我不是 C 的人,所以我想知道我的情况有什么不同吗?
使用c_void_p
或LPVOID
。这将是指针的大小,实际类型无关紧要,因为您永远不会访问 Internal
和 InternalHigh
成员。
使用 POINTER(ULONG)
可以,但 POINTER(c_char)
或任何其他指针类型也可以。类型仍然是错误的,除了现在你正在分配一个你实际上不需要的新类型对象。
如果您需要使用其 "correct" 类型访问内部成员,那么您需要定义两种不同的 OVERLAPPED 结构之一,具体取决于您使用的是 32 位还是 64 位版本Python。类似于:
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),
...]
我在 Windows 上使用 Python ctypes 库并实现 OVERLAPPED structure. It has 2 members of ULONG_PTR type that is not available in ctypes.wintypes. According to Microsoft ULONG_PTR 是一个 ULONG,它取决于指针大小。我可以在 Python 中使用 wintypes.ULONG 而不是 ULONG_PTR 还是有更好的方法?
我发现了 OVERLAPPED 结构的几个不同实现:here POINTER(ULONG)) is used instead of ULONG_PTR and here - LPVOID。但是 ULONG_PTR 不是指针,所以恕我直言,这些类型不适合使用。我错了吗?我尝试了 LPVOID 并且它有效,但我不是 C 的人,所以我想知道我的情况有什么不同吗?
使用c_void_p
或LPVOID
。这将是指针的大小,实际类型无关紧要,因为您永远不会访问 Internal
和 InternalHigh
成员。
使用 POINTER(ULONG)
可以,但 POINTER(c_char)
或任何其他指针类型也可以。类型仍然是错误的,除了现在你正在分配一个你实际上不需要的新类型对象。
如果您需要使用其 "correct" 类型访问内部成员,那么您需要定义两种不同的 OVERLAPPED 结构之一,具体取决于您使用的是 32 位还是 64 位版本Python。类似于:
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),
...]