ctypes字符串指针类型错误

问题描述 投票:1回答:1

这是一个调用DLL的ctypes包装器。它将一个简单的文本文件作为字节数组(utf-8编码)读取,创建一个相同长度的字符串缓冲区,并将它们传递给DLL。使用下面的代码,我得到错误:预期的LP_c_char_p实例而不是c_char_Array_8049。

我也尝试将两个数组作为ctypes.c_byte传递,但这也不起作用。

file_name = r"C:\Projects\--Data_Files\Strings\Sample_Text.txt"
f = io.open(file_name, mode="r", encoding="utf-8")
CA_my_str = f.read()    

CA_no_punct = ctypes.create_string_buffer(len(CA_my_str))

Input_Length_Array = []
Input_Length_Array.append(len(CA_no_punct))
Input_Length_Array.append(len(CA_my_str))

length_array_out = (ctypes.c_double * len(Input_Length_Array))(*Input_Length_Array)

hDLL = ctypes.WinDLL("C:/NASM_Test_Projects/String_Processing/String_Processing.dll")
CallName = hDLL.Main_Entry_fn
CallName.argtypes = [ctypes.POINTER(ctypes.c_char_p),ctypes.POINTER(ctypes.c_char_p), ctypes.POINTER(ctypes.c_double)]
CallName.restype = ctypes.POINTER(ctypes.c_double)

ret_ptr = CallName(CA_no_punct, CA_my_str, length_array_out)

所以问题是:两个数组CA_my_str和CA_no_punct的正确ctypes argtype是什么?

编辑:根据下面的要求,这是NASM的切入点:

Main_Entry_fn:
push rdi
push rbp
mov [no_punct_ptr],rcx
mov [my_str_ptr],rdx
mov [data_master_ptr],r8
; Now assign lengths
lea rdi,[data_master_ptr]
mov rbp,[rdi]
xor rcx,rcx
movsd xmm0,qword[rbp+rcx]
cvttsd2si rax,xmm0
mov [no_punct_length],rax
add rcx,8
movsd xmm0,qword[rbp+rcx]
cvttsd2si rax,xmm0
mov [my_str_length],rax
add rcx,8
call String_Processing_fn
exit_label_for_Main_Entry_fn:
pop rbp
pop rdi
ret
python ctypes
1个回答
1
投票

c_char_p对于两个数组参数都是正确的,相当于C的char*

CallName.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_double)]

使用CA_no_punct.raw查看输出缓冲区的完整内容。

© www.soinside.com 2019 - 2024. All rights reserved.