首页 > 解决方案 > 我应该怎么做才能将多个 ctypes 数据类型分配给 Python 中的单个 ctypes 实例?

问题描述

我正在将 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 个数据类型的变量,即短、短、长和短,这些变量在 C 代码中实现。但是我已经将python中的ODBM数据结构声明为ctypes.c_short * 4即4个短数据类型的变量。

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

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

标签: pythonpointersdllpass-by-referencectypes

解决方案


ctypes.Structure此处应使用A :

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)

推荐阅读