2011-03-06 7 views
1

지금까지 나는 그것과 함께 작동하는 Python을위한 것이 아니라는 DLL을 얻었다. 그리고 타입 반환 : 나는 잘못하고 있기 때문에 인수를 전달할 수 없다. 그리고 나는 문서를 이해하지 못한다. 내가 어떻게해야하는지에 관해서. 기본적으로, 내가 테스트하고있는 DLL의 함수 이름은 "iptouint"입니다. c_char_p를 취하여 c_double을 반환합니다. 여기 파이썬 ctypes 던지고 오류?

내 코드입니다 :

nDll = ctypes.WinDLL('ndll.dll') 

nDllProto = ctypes.WINFUNCTYPE(ctypes.c_double) 
nDllInit = nDllProto(("dllInit", nDll)) 

nDllTestProto = ctypes.WINFUNCTYPE(ctypes.c_double,ctypes.c_char_p) 
nDllTest = nDllTestProto(("iptouint",nDll),((1, "p1",0),(1, "p2",0))) 

#This is the line that throws the error: 
print("IP: %s" % nDllTest("12.345.67.890")) 

''' 
It gives me the error: 
ValueError: paramflags must have the same length as argtypes 
Im not sure what to do; Ive certainly played around with it to no avail. 
Help is much appreciated. 
Thanks. 
''' 
+0

"ndll"dll에서 실제로 호출 할 함수의 이름과 C 문서를 기술하십시오. – jsbueno

+0

@jsbueno 내가 말했듯이이 함수의 이름은 "iptouint"이며 double을 취하여 문자열을 반환합니다. – pajm

답변

2

단순히 나타내는 시도 걸리는 argtypes을하는 ctypes과 사람이 반환

1)의 경우 :

nDll = ctypes.WinDLL('ndll.dll') 
nDll.restype = ctypes.c_double 
nDll.argtypes = [ctypes.c_char_p] 

result = nDll.iptouint("12.345.67.890").value 

,하지만 다음 사항을 고려 , 이름에서 알 수 있듯이 이것은 문자열에서 IPv4 값을 Unsigned Int로 변환합니다. 반환 형식은 "double"이 아닙니다. ctypes.c_uint32

2) 귀하의 예제 값은 valit IPv4 주소가 아니며 32 비트 정수로 변환 할 수 없습니다 ("이중"(즉 64 비트 부동 소수점 숫자)은 의미가 없습니다) - 단순히 무효입니다

3) 파이썬에서 ipv4 주소에 부호없는 32 비트 값을 사용하려는 경우에는 필요하지 않습니다. 순수한 파이썬으로는 매우 읽기 쉽고, 쉽고, 멀티 플랫폼 방식이 있습니다.

def iptoint(ip): 
    value = 0 
    for component in ip.split("."): 
     value <<= 8 #shifts previous value 8 bits to the left, 
        #leaving space for the next byte 
     value |= int(component) # sets the bits for the new byte in the address 
    return value 

갱신 : 예를 들어 - https://docs.python.org/3/library/ipaddress.html - 픽처 인 픽처 파이썬 2.x를 위해 설치로 사용할 수도 있습니다 - 파이썬 3.x의에서 은 여기서 ipaddress 모듈이는 항상이 문제를 처리 할 수 ​​있습니다 올바른 방법으로 IPv6에서도 잘 작동합니다.

+0

예 - 슬롯에 내 IP가 있었지만 간단하게 덮었습니다. 또한이 DLL은 문자열과 복식에만 사용되었습니다. 일단 파이썬 안에 있으면 효과가 없습니다. 또한 이것은 단 하나의 기능이었습니다. DLL은 실제로 읽어야하는 매우 독특한 메시지에서 읽을 수 있기 때문에 실제로 유용한 네트워크입니다. 답변 해 주셔서 감사합니다. :) 나는 당신이 제안한 것을 시도 할 것입니다. – pajm

+0

대기 -이 코드는 하나의 기능 만 가진 DLL에서만 제대로 작동하는 것 같습니다. 내 것이 많다 ... 나는 이것을 쉽게 유지하고 DLL에있는 모든 함수를 사용할 수있는 방법이 있는가? – pajm

+0

cpython이 어떤 매개 변수를 보내고 받을지 알 수 있도록 사용할 각 기능을 decaroate해야합니다. 그렇지 않으면 어떤 숫자에 대해서도 "int"와 같은 매개 변수로 전달되는 anuy 문자열에 대해 "char_p"와 같은 전문적인 추측을 시도합니다 (그러나 어쨌든 함수는 int를 반환한다고 가정합니다). 사용할 각 함수에 대해 argtypes 및 restype을 설정하기 만하면됩니다. – jsbueno