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_pLPVOID。这将是指针的大小,实际类型无关紧要,因为您永远不会访问 InternalInternalHigh 成员。

使用 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),
                ...]