2011-03-06 7 views
1

これまでのところ、Pythonで動作するDLLでないDLLが得られました。戻り値:私は間違っているので引数を渡すことができません。私は物事をどうやってやろうとしているのか。基本的に、私がテストしている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

単に示すしようと、それは取るが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)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の中に入ってしまえば、実際には違いはありません。 また、これは1つの機能にすぎません。 DLLは、実際には、私が読む必要がある非常にユニークなメッセージから読むことができるので、非常に有用なネットワーキングです。 ありがとうございます。 :)私はあなたが提案したものを試してみます。 – pajm

+0

待機 - このコードは、1つの機能しか持たないDLLでうまくいくようです。私の多くは...私はこれを簡単に保つことができ、DLLのすべての関数を使用する方法はありますか? – pajm

+0

cpythonがどのパラメータを送って戻ってくるかを知るために使う関数をデカルトする必要があります。それ以外の場合は、任意の数値に対して「int」、パラメータとして渡すanuy文字列に対して「char_p」などの推測された推測を試行します(ただし、関数はintを返します)。あなたが使う関数ごとにargtypesとrestypeを設定するだけです。 – jsbueno

関連する問題