我应该怎么做才能将多个 ctypes 数据类型分配给 Python 中的单个 ctypes 实例?

What should I do to have multiple ctypes data types assigned to a single ctypes instance in Python?

我正在将 C 代码转换为使用 .dll 文件的 Python 代码。 从 DLL 访问命令的语法如下:

cnc_rdmacro(unsigned short FlibHndl, short number, short length, ODBM *macro);

C代码 指向odbm数据结构的指针如下:

typedef struct  odbm {
    short   datano ;    /* custom macro variable number */
    short   dummy ;     /* (not used) */
    long    mcr_val ;   /* value of custom macro variable */
    short   dec_val ;   /* number of places of decimals */
} ODBM ;

用于访问dll命令的C代码:

  short example( short number )
{
        ODBM macro ;
        char strbuf[12] ;
        short ret ;
        ret = cnc_rdmacro( h, number, 10, &macro ) ;

我根据上面的C代码转换后的python代码如下:

import ctypes
fs = ctypes.cdll.LoadLibrary(r".dll filepath")
ODBM = (ctypes.c_short * 4)() #the datatype conversion code from the above C code
ret = fs.cnc_rdmacro(libh, macro_no, 10, ctypes.byref(ODBM))

我可以在上面的代码中没有任何错误地得到输出。

ODBM的实际数据结构声明了4个数据类型为short、short、long和short的变量,它们是在C代码中实现的。但是我已经在 python 中将 ODBM 数据结构声明为 ctypes.c_short * 4 即 4 个短数据类型的变量。

但我的必要是声明ODBM 结构与C 代码中相同,并将其传递给ctypes.byref()

最终解决方案是将多种数据类型作为一个 ctypes 实例包含在单个变量中。请帮助我。

此处应使用ctypes.Structure

import ctypes

class ODBM(ctypes.Structure):
    _fields_ = [("datano", ctypes.c_short),
                ("dummy", ctypes.c_short),
                ("mcr_val", ctypes.c_long),
                ("dec_val", ctypes.c_short)]

fs = ctypes.cdll.LoadLibrary(r".dll filepath")
odbm = ODBM()
ret = fs.cnc_rdmacro(libh, macro_no, 10, ctypes.byref(odbm))

print(odbm.mcr_val)