我应该怎么做才能将多个 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, ¯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个数据类型为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)
我正在将 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个数据类型为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)