下面是一个用于调用DLL的ctype包装器。它将一个简单的文本文件读取为一个字节数组(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类型是什么?
编辑:下面的每个请求都是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发布于 2018-03-09 17:03:53
对于两个数组参数,c_char_p都是正确的,并且等价于C的char*
CallName.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_double)]使用CA_no_punct.raw查看输出缓冲区的全部内容。
https://stackoverflow.com/questions/49181097
复制相似问题