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

和它工作得很好,根据它应该保存在作为参数的80字节串的调谐器驱动程序DLL的文档。 然而,当我尝试使用调用该函数的 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 [],根据手册下面的值是正确的太多,我只是不知道为什么我总是收到的窗口访问冲突写00000000

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))

的序列号是由指的一个给定的可变然而审查。有人知道该怎么做?你看到任何错误与我的投入?

由于 /马萨达克

有帮助吗?

解决方案

我想,这是你通过在long max_range[]参数的值。函数需要一个指向long整数那里(它要求long整数数组),但你传递一个长的零值(c_long()呼叫的结果)的值,这是隐式转换一个空指针。我怀疑的功能,然后尝试写信给max_range传递的地址,即。空指针,因此访问冲突在地址0x00000000

要创建longs的阵列在max_range传递,首先由阵列数据类型与所述阵列(为了清楚起见有些详细)的大小乘创建的阵列类型:

array_size = 3
ThreeLongsArrayType = c_long * array_size

可以然后实例的阵列等你会与任何其他Python类:

array = ThreeLongsArrayType()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top