2014-09-08 3 views
1

나는 python으로 c dll을 통해 HV-Supply와 통신을 시도합니다. 가장 단순한 기능이 작동합니다. 하지만 더 복잡한 함수 CAENHVInitSystem을 호출하면 오류가 발생합니다 : OSError : 예외 : 액세스 위반이 0x00000001을 읽습니다. 나는 파이썬에서 ctypes에 대해 아주 새로운 것이다. 내가 아는 한,이 오류는 아마도 내 인자 중 일부가 잘못된 유형이기 때문에 나타날 수 있습니다. 하지만 어떻게 더 잘못된 인수가 정확하게 알고 디버깅 할 수 있습니까? 누구든지 내 실수를 봤어? 미리ctypes : OSError : 예외 : 읽기 액세스 위반 0x00000001

import os 
from ctypes import * 

bib = CDLL("CAENHVWrapper") 

ret = bib.CAENHVLibSwRel() # This call works 
print(c_char_p(ret)) 

sysType = c_int(1) #SY2527 
link = c_int(0) #TCP/IP 
#arg = c_char_p(b'149.217.10.241') #i change it for test to c_void_p but later the arg should be the ip adress 
arg = c_void_p()     
user = c_char_p(b'admin') 
passwd = c_char_p(b'admin') 
sysHndl = c_int() 

# c function definition in the header file 
#CAENHVLIB_API CAENHVRESULT CAENHV_InitSystem(
# CAENHV_SYSTEM_TYPE_t system, 
# int LinkType, 
# void *Arg, 
# const char *UserName, 
# const char *Passwd, 
# int *handle); 

# definition of the enum of the first argument 
#typedef enum { 
# SY1527  = 0, 
# SY2527  = 1 
#} CAENHV_SYSTEM_TYPE_t; 

bib.CAENHVInitSystem.argtypes = [c_int, c_int, c_void_p, c_char_p, c_char_p,  POINTER(c_int)] 
ret = bib.CAENHVInitSystem(sysType, link, arg, user, passwd, byref(sysHndl)) 

print(ret) 
print(bib.CAENHV_GetError(sysHndl)) 

답변

3

감사 CAENHVInitSystem의 최초의 파라미터 타입 const char*와 시스템 이름이다. 실수로 값 1을 가진 정수를 전달하고 있습니다. CAENHVInitSystem이이를 포인터로 해석하면 주소 1에서 메모리를 읽으려고합니다. 따라서 오류가 발생합니다. 첫 번째 인수 형식을 c_char_p으로 변경하고 텍스트를 전달하십시오.

내가 알 수있는 한,이 함수에는 6 개가 아닌 5 개의 매개 변수가 있기 때문에 위에서 확인한 것보다 많은 오류가 있다고 생각됩니다.

이진 interop에 대해 질문 할 때 인터페이스의 양쪽에 대한 세부 정보를 제공해야합니다. CAENHVInitSystem에 대한 웹 검색을 수행하고 내가 찾은 선언문이 사용중인 것과 일치하는지 확인하여 답변했습니다. 그러나 아마도 그런 경우는 아닙니다. 아마도 CAENHVInitSystem에 대한 진실한 신고가있을 것이며 그 정보는 중요합니다. 그것은 의문의 여지가 있어야합니다.

관련 문제