簡體   English   中英

python中的ctypes,在DLL中調用函數時出現問題

[英]ctypes in python, problem calling a function in a 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'

而且效果很好,根據文檔,它應該將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))

但是,序列號是通過引用變量來檢查的。 有人知道該怎么辦嗎?您看到我的輸入有任何錯誤嗎?

謝謝/ Mazdak

我認為這是您在long max_range[]參數中傳遞的值。 該功能需要一個指向一個long整型那里(它要求陣列long整數),但你傳遞的零(的結果很 c_long()這是隱式轉換為空指針調用)。 我懷疑函數然后嘗試寫入在max_range傳遞的地址,即。 空指針,因此在地址0x00000000的訪問沖突。

要創建一個long數組以傳遞給max_range ,您首先要通過將數組數據類型與數組大小相乘(為了清楚起見,有些冗長)來創建數組類型:

array_size = 3
ThreeLongsArrayType = c_long * array_size

然后,您可以像使用任何其他Python類一樣實例化數組:

array = ThreeLongsArrayType()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM