在Python ctypes的,问题调用DLL中的函数
题
喂!正如你可能已经注意到我有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
。
要创建long
s的阵列在max_range
传递,首先由阵列数据类型与所述阵列(为了清楚起见有些详细)的大小乘创建的阵列类型:
array_size = 3
ThreeLongsArrayType = c_long * array_size
可以然后实例的阵列等你会与任何其他Python类:
array = ThreeLongsArrayType()
不隶属于 StackOverflow