파이썬의 CTypes, DLL에서 함수를 호출하는 문제
문제
여기요! 알다시피, 나는 ctypes에 성가신 문제가 있습니다. 나는 악기와 의사 소통하려고 노력하고 있으며, 그렇게하려면 DLL 드라이버와 통신하려면 CTypes를 사용해야합니다.
지금까지 나는 이것을함으로써 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))
그러나 일련 번호는 변수를 참조하여 검열됩니다. 누군가가 무엇을 해야할지 알고 있습니까?, 내 입력에 오류가 표시됩니까?
감사합니다 /Mazdak
해결책
나는 그것이 당신이 통과하는 가치라고 생각합니다. long max_range[]
논쟁. 이 함수는 a에 대한 포인터를 기대합니다 long
거기에 정수 (배열을 요구합니다 long
정수), 그러나 당신은 오래 지나가고 있습니다 값 0의 결과 c_long()
콜 포인터에 암시 적으로 캐스팅됩니다. 나는 그 기능이 통과 된 주소에 쓰려고한다고 생각한다. max_range
, 즉. 널 포인터, 따라서 주소에서의 액세스 위반 0x00000000
.
배열을 만듭니다 long
통과 할 s max_range
, 먼저 배열 데이터 유형에 배열의 크기를 곱하여 배열 유형을 만듭니다 (명확성을위한 다소 장점).
array_size = 3
ThreeLongsArrayType = c_long * array_size
그런 다음 다른 Python 클래스와 마찬가지로 배열을 인스턴스화 할 수 있습니다.
array = ThreeLongsArrayType()