python:ctypes,argtypes是否会自动调用构造函数?

时间:2019-03-07 21:24:51

标签: python ctypes

我有可以使用的代码,但是我不知道为什么。

str2payload = lib3.str2payload
str2payload.argtypes = [POINTER(mbuf_t), POINTER(c_char)]

# sbuf = ..
val = b"asdfasdfasdhfjkasgdfjasgdfhjasgdfjhasgdfjhasgdfgjh"
rmr_str2payload(sbuf, val)

这按预期工作。在这里,val只是python中的bytes对象。但是,函数签名说它应该是POINTER(c_char)。那么神奇的转换是什么呢?

顺便说一句,我使用POINTER(c_char)的原因是因为它在这里说:https://docs.python.org/3.7/library/ctypes.html#ctypes.c_char_p

1 个答案:

答案 0 :(得分:1)

来自ctypes documentation

  

调用外部函数时,每个实际参数都传递给argtypes元组中各项的from_param()类方法,该方法允许将实际参数调整为外部函数接受的对象。例如,argtypes元组中的c_char_p项将使用ctypes转换规则将作为参数传递的unicode字符串转换为字节字符串。

     

新增:现在可以将项目放入不是ctypes类型的argtype中,但是每个项目必须具有from_param()方法,该方法返回可用作参数的值(整数,字符串,ctypes实例)。这样就可以定义可以将自定义对象用作功能参数的适配器。