簡體   English   中英

使用未知的字段類型定義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可以識別的原始類型?

您只需要正確確定頂層結構的大小即可。 InitializeCriticalSection應該處理設置結構。

查看Windows標頭,這應在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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM