定义具有未知字段类型的 python ctypes 结构
Define python ctypes structure with unknown field type
我有一个定义结构的 dll。在这个结构中有一个类型为 CRITICAL_SECTION
的字段,如 windows.h
中所包含的那样。如何在 python 中定义一个 ctypes 结构来引用这个类型?由于 CRITICAL_SECTION
本身是一个结构(在其自己的定义中引用了其他结构),我真的必须定义 python ctype 等价物以便我有一个 python CRITICAL_SECTION
我可以参考?有没有更好的方法?
示例 C 程序:
...
typedef struct some_struct {
...
CRITICAL_SECTION field1;
} SOME_STRUCT;
...
示例Python程序:
...
class SOME_STRUCT(Structure):
_fields_ = [... ('field1', CRITICAL_SECTION)]
如何让 ctypes 识别 CRITICAL_SECTION
是什么,而不用陷入将所有内容定义为 ctypes 识别的原始类型的困境?
您只需要正确设置 top-level 结构大小即可。 InitializeCriticalSection
应该负责设置结构。
查看 Windows headers,这应该适用于 32 位和 64 位系统:
from ctypes import *
from ctypes import wintypes as w
# Set to an unsigned int type that is 32- or 64-bit depending on OS architecture.
# I didn't see a wintype that worked.
ULONG_PTR = c_size_t
class CRITICAL_SECTION(Structure):
_fields_ = [('DebugInfo',w.LPVOID),
('LockCount',w.LONG),
('RecursionCount',w.LONG),
('OwningThread',w.HANDLE),
('LockSemaphore',w.HANDLE),
('SpinCount',ULONG_PTR)]
k32 = WinDLL('kernel32')
InitializeCriticalSection = k32.InitializeCriticalSection
InitializeCriticalSection.argtypes = POINTER(CRITICAL_SECTION),
InitializeCriticalSection.restype = None
s = CRITICAL_SECTION()
InitializeCriticalSection(byref(s))
我有一个定义结构的 dll。在这个结构中有一个类型为 CRITICAL_SECTION
的字段,如 windows.h
中所包含的那样。如何在 python 中定义一个 ctypes 结构来引用这个类型?由于 CRITICAL_SECTION
本身是一个结构(在其自己的定义中引用了其他结构),我真的必须定义 python ctype 等价物以便我有一个 python CRITICAL_SECTION
我可以参考?有没有更好的方法?
示例 C 程序:
...
typedef struct some_struct {
...
CRITICAL_SECTION field1;
} SOME_STRUCT;
...
示例Python程序:
...
class SOME_STRUCT(Structure):
_fields_ = [... ('field1', CRITICAL_SECTION)]
如何让 ctypes 识别 CRITICAL_SECTION
是什么,而不用陷入将所有内容定义为 ctypes 识别的原始类型的困境?
您只需要正确设置 top-level 结构大小即可。 InitializeCriticalSection
应该负责设置结构。
查看 Windows headers,这应该适用于 32 位和 64 位系统:
from ctypes import *
from ctypes import wintypes as w
# Set to an unsigned int type that is 32- or 64-bit depending on OS architecture.
# I didn't see a wintype that worked.
ULONG_PTR = c_size_t
class CRITICAL_SECTION(Structure):
_fields_ = [('DebugInfo',w.LPVOID),
('LockCount',w.LONG),
('RecursionCount',w.LONG),
('OwningThread',w.HANDLE),
('LockSemaphore',w.HANDLE),
('SpinCount',ULONG_PTR)]
k32 = WinDLL('kernel32')
InitializeCriticalSection = k32.InitializeCriticalSection
InitializeCriticalSection.argtypes = POINTER(CRITICAL_SECTION),
InitializeCriticalSection.restype = None
s = CRITICAL_SECTION()
InitializeCriticalSection(byref(s))