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

时间:2009-06-15 10:10:34

标签: python dll pointers ctypes

喂!你可能已经注意到我对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'

它运行得很好,根据文档,它应该将调谐器驱动程序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 个答案:

答案 0 :(得分:3)

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

要创建一个long s数组以传入max_range,首先要通过将数组数据类型与数组的大小相乘来创建数组类型(为了清晰起见,有点冗长):

array_size = 3
ThreeLongsArrayType = c_long * array_size

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

array = ThreeLongsArrayType()