为了账号安全,请及时绑定邮箱和手机立即绑定

Python ctypes、dll 函数参数

Python ctypes、dll 函数参数

慕慕森 2021-11-16 09:57:07
我有一个带有函数的 DLLEXPORT long Util_funct( char *intext, char *outtext, int *outlen )看起来它需要 char *intext、char *outtext、int *outlen。我试图在 python 中定义不同的数据类型,所以我可以传递一个参数,但到目前为止没有成功。from ctypes import *string1 = "testrr"#b_string1 = string1.encode('utf-8')dll = WinDLL('util.dll')funct = dll.Util_functfunct.argtypes = [c_wchar_p,c_char_p, POINTER(c_int)]funct.restype = c_char_pp = c_int()buf = create_string_buffer(1024)retval = funct(string1, buf, byref(p))print(retval)输出为 None,但我看到p. 你能帮我为函数定义正确的数据类型吗?
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

这应该有效:


from ctypes import *


string1 = b'testrr'     # byte string for char*


dll = CDLL('util.dll')  # CDLL unless function declared __stdcall

funct = dll.Util_funct


funct.argtypes = c_char_p,c_char_p,POINTER(c_int) # c_char_p for char*

funct.restype = c_long # return value is long


p = c_int()

buf = create_string_buffer(1024) # assume this is big enough???

retval = funct(string1, buf, byref(p))


print(retval)


查看完整回答
反对 回复 2021-11-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

感谢您的所有回答!我想我想通了。使用不是最聪明的方式,而只是尝试/试验不同的数据类型。由于这不是一个常见的图书馆,而且我没有关于它的信息,也许 sulution 对其他人不会很有用,但无论如何。


看起来函数一次只处理一个字符,因为如果我传递一个单词它只返回一个编码字符。所以这里是:


from ctypes import *



buf = create_unicode_buffer(1024)

string1 = "a"

c_s = c_wchar_p(string1)


dll = CDLL('util.dll')

enc = dll.Util_funct


enc.argtypes = c_wchar_p, c_wchar_p, POINTER(c_int)


enc.restype = c_long # i don't think this type matters at all


p = c_int()



enc(c_s, buf, byref(p))



print(p.value)

print(buf.value)

输出为 1 和符号 ^


再次感谢


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信