python ctypes抛出错误?

时间:2011-03-06 00:27:12

标签: python dll ctypes

到目前为止,我已经得到了一个不适合python使用的DLL,并且类型返回:我只是不能传递它的参数因为我做错了而且我不太明白关于我应该如何做事的文件。基本上,我正在测试的DLL中的函数被命名为“iptouint”。它需要一个c_char_p并返回一个c_double。

这是我的代码:

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.
'''

1 个答案:

答案 0 :(得分: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位整数(它也不是有意义的“双” ​​- 即64位浮点数) - 它只是无效< / p>

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中有ipaddress模块​​ - https://docs.python.org/3/library/ipaddress.html - 也可以作为Python 2.x的pip安装使用 - 它可以始终以正确的方式处理它,并且也适用于IPv6。