문제

여기요! 알다시피, 나는 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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top