2011-03-06 87 views
1

到目前爲止我已經得到了一個DLL並不意味着python可以使用它,而類型返回:我只是不能傳遞它的參數,因爲我做錯了,我不太瞭解文檔關於我應該如何做事情。基本上,我測試的DLL中的函數名爲「iptouint」。它需要一個c_char_p並返回一個c_double。python 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

嘗試簡單地指示的ctypes它採用argtypes和那些返回:

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

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

雖然,考慮以下幾點:

1)如果,如名稱所示,這將字符串中的IPv4值轉換爲Unsigned Int,返回類型os不像您所說的那樣是「double」 - 它將是ctypes.c_uint32

2)您的示例值不是一個valit IPv4地址,並且不能轉換爲32位整數(作爲「double」 - 即64位浮點數也不合理) - 它僅僅是無效的

3)如果你只是想在Python中爲一個ipv4地址設置一個無符號的32位值,那麼你不需要這樣做。有很多,非常可讀,更容易和多平臺的方式來用純python來做到這一點。例如:

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 

更新: 在Python 3.x中存在的ip地址模塊 - https://docs.python.org/3/library/ipaddress.html - 這也可以作爲一個點安裝的Python 2.x的 - 它可以在很好地處理這正確的方式,並與IPv6一起正常工作。

+0

是的 - 我在插槽中有我的IP,我只是把它覆蓋了。另外,這個DLL只用於處理字符串和雙打。一旦它在python裏面,它確實沒有什麼區別。 另外,這只是一個功能。該DLL實際上是一個網絡,我覺得它非常有用,因爲它可以讀取我需要讀取的非常獨特的消息。 謝謝你的迴應。 :)我會嘗試你的建議。 – pajm

+0

等待 - 此代碼似乎只適用於只有一個函數的DLL。我有很多...有什麼辦法可以保持這個容易,並使用DLL中的所有功能? – pajm

+0

你必須decaroate你將使用的每個函數,以便cpython知道發送和接收哪些參數。否則,它只是嘗試受過猜測的猜測 - 例如對任何數字都使用「int」,對於作爲參數傳遞的anuy字符串使用「char_p」(但它會假設函數返回int)。只需爲將要使用的每個函數設置argtypes和restype。 – jsbueno