我正在将C代码转换为使用.dll文件的Python代码。下面给出了从DLL访问命令的语法:
cnc_rdmacro(unsigned short FlibHndl, short number, short length, ODBM *macro);指向odbm数据结构的C代码指针如下:
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命令的代码:
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个变量。
但我必须声明ODBM结构,与C代码中的结构相同,并将其传递给ctypes.byref()。
最终的解决方案是将多个数据类型作为ctypes实例包含在单个变量中。请帮帮我。
发布于 2021-09-17 12:32:30
这里应该使用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)https://stackoverflow.com/questions/69222927
复制相似问题