Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义具有未知字段类型的python ctypes结构_Python_C_Ctypes - Fatal编程技术网

定义具有未知字段类型的python ctypes结构

定义具有未知字段类型的python ctypes结构,python,c,ctypes,Python,C,Ctypes,我有一个dll,它定义了一个结构。此结构中有一个字段,其类型为CRITICAL\u部分,包含在windows.h中。如何在python中定义ctypes结构来引用此类型?既然CRITICAL\u节本身就是一个结构(在它自己的定义中引用了其他结构),那么我真的必须定义python的ctype等价物以便我有一个pythonCRITICAL\u节可以引用吗?有更好的办法吗 示例C程序: ... typedef struct some_struct { ... CRITICAL_SECT

我有一个dll,它定义了一个结构。此结构中有一个字段,其类型为
CRITICAL\u部分
,包含在
windows.h
中。如何在python中定义ctypes结构来引用此类型?既然
CRITICAL\u节
本身就是一个结构(在它自己的定义中引用了其他结构),那么我真的必须定义python的ctype等价物以便我有一个python
CRITICAL\u节
可以引用吗?有更好的办法吗

示例C程序:

...
typedef struct some_struct {
    ...
    CRITICAL_SECTION field1;
} SOME_STRUCT;
...
...
class SOME_STRUCT(Structure):
    _fields_ = [... ('field1', CRITICAL_SECTION)]
Python程序示例:

...
typedef struct some_struct {
    ...
    CRITICAL_SECTION field1;
} SOME_STRUCT;
...
...
class SOME_STRUCT(Structure):
    _fields_ = [... ('field1', CRITICAL_SECTION)]

我如何让ctypes识别出什么是
关键部分
,而不去定义ctypes识别的所有基本类型的兔子洞?

您只需要正确地确定顶级结构的大小<代码>初始化CriticalSection应负责设置结构

查看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))

未经测试,但为了Python的目的,将其定义为
c_ubyte*x
,其中x是
sizeof(CRITICAL_部分)
。只要您的最终结构大小合适,您就可以将其视为不透明的字节数组。那么
sizeof(CRITICAL_SECTION)
的大小是多少呢D@AnttiHaapala问问你的C编译器:^)在我的C编译器上是40字节,但会有所不同。我在下面找到了一个更好的答案。谢谢你的回复。这似乎对我有效,但我仍然需要时间来真正测试它。我会回来接受,我知道它100%适用于我的特定应用程序。