python中的ctypes,在DLL中调用函数的问题

Posted

技术标签:

【中文标题】python中的ctypes,在DLL中调用函数的问题【英文标题】:ctypes in python, problem calling a function in a DLL 【发布时间】:2009-06-15 10:10:34 【问题描述】:

嘿!你可能已经注意到我对 ctypes 有一个烦人的问题。我正在尝试与仪器通信,为此我必须使用 ctypes 与 DLL 驱动程序通信。

到目前为止,我已经成功地通过这样做导出了 DLL:

>>> from ctypes import *
>>>maury = WinDLL( 'MLibTuners')
>>> maury
(WinDLL 'MlibTuners', handle 10000000 at 9ef9d0)
>>> maury.get_tuner_driver_version()
(_FuncPtr object at 0x009F6738)
>>> version_string = create_string_buffer(80)
>>> maury.get_tuner_driver_version(version_string)
2258920
>>> print version_string.value
'Maury Microwave MT993V04 Tuner Driver DLL, Version 1.60.00, 07/25/2007'

而且它工作得很好,根据文档,它应该将 Tuner Driver DLL 保存在作为参数给出的 80 字节字符串中。 但是,当我尝试使用名为 add_tuner 的函数时,它会失败。文档是这样说的:

short add_tuner(short tuner_number, char model[], short serial_number,
               short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[],
               double *fmin, double *fmax, double *fcrossover, char error_string[])

这就是我尝试调用上述函数的方式: 更改的参数都是指针和 max_range[],根据手册,下面的值也是正确的,我只是不知道为什么我一直收到 windows 访问冲突写入 0x00000000

no_motors = pointer(c_short())
f_min = pointer(c_double())
f_max = pointer(c_double())
f_crossover = pointer(c_double())
maury.add_tuner(c_short(0), c_char_p('MT982EU'), c_short(serial_number), c_short(0),
                                c_short(1),no_motors, c_long(),
f_min,f_max,f_crossover, create_string_buffer(80))

序列号是通过引用变量来给出的,但是会被删减。有人知道该怎么做吗?您是否发现我的输入有任何错误?

谢谢 /马自达

【问题讨论】:

【参考方案1】:

我认为这是您在 long max_range[] 参数中传递的值。该函数需要一个指向 long 整数的指针(它要求一个 long 整数数组),但是您传递的长 为零(c_long() 调用的结果),它被隐式转换为空指针。我怀疑该函数随后会尝试写入通过max_range 传递的地址,即。空指针,因此地址 0x00000000 的访问冲突。

要创建longs 的数组以传入max_range,首先通过将数组数据类型乘以数组的大小来创建数组类型(为清楚起见有些冗长):

array_size = 3
ThreeLongsArrayType = c_long * array_size

然后您可以像使用任何其他 Python 类一样实例化一个数组:

array = ThreeLongsArrayType()

【讨论】:

哇!那是真的!,完全错过了那个,那就是它。那么如何用 c_long()s 声明一个数组呢?是 arrayLong = c_long() * 3 吗?原因,当我将 c_long 更改为 arrayLong 时,它说它不知道如何转换参数 7(ctypes.argumentError) 我在我的回答中添加了一个关于如何做到这一点的解释:)

以上是关于python中的ctypes,在DLL中调用函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中从 dll 调用函数

如何使用 ctypes 调用具有双下划线函数名的 DLL 函数?

怎样用python调用dll

python使用ctypes调用C编译dll函数方法

我现在想把自己写的python模块源代码封装成dll,然后在别的python脚本里调用,可以吗?

python--ctypes模块:调用C函数