python - 我应该怎么做才能将多个 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, ¯o ) ;
我根据上面的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
实例。请帮帮我。
解决方案
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)
推荐阅读
- r - 是否有一个 R 函数来重新评估数据框列的类别?
- c# - OleDB Select 命令不适用于多个 OR 语句(C#)
- kubernetes - 如何不覆盖 Helm 模板中随机生成的秘密
- vuetify.js - 如何创建 Vuetify 多步骤表单?
- php - 如何通过连接到另一个数据库中的表来删除模式?
- c# - Entity Framework 6.x Code First 来自数据库,添加列属性
- arrays - Angular - 如何在操作数组时将更改从变量绑定到 html
- c# - 在 C# 中从服务器端更新代码时出现空错误
- python - python 上的 xlsxwriter 中的“没有这样的文件或目录”作为服务
- ejs - 为什么我在简单的 ejs 文件上使用 eslint-ejs 插件时出现解析错误?