以下是基本信息。虽然在这种情况下不是必需的,但正确设置.argtypes
和.restype
有助于ctypes
正确处理参数并检测错误传递的参数。
与传递数组到C函数类似,create_string_buffer
返回一个c_char_Array_array_size
对象,但它被编组为指向其第一个元素(c_char_p
)的指针,以便与.argtypes
分配相匹配。
如果没有.argtypes
分配,传递不正确的东西(例如int
或create_unicode_buffer()
数组)将崩溃或产生错误结果。但正确定义它会捕捉这些错误并引发异常。
test.c
#include <string.h>
#ifdef _WIN32
# define API __declspec(dllexport)
#else
# define API
#endif
API int get_camera_info(char * description, char * serial_number, char * manufacturer)
{
strcpy(description, "Description");
strcpy(serial_number, "12345678");
strcpy(manufacturer, "Manufacturer");
return 1;
}
test.py
from ctypes import *
MAX_STR = 256
dll = CDLL('./test')
dll.get_camera_info.argtypes = c_char_p,c_char_p,c_char_p
dll.get_camera_info.restype = c_int
desc = create_string_buffer(MAX_STR)
sn = create_string_buffer(MAX_STR)
mfg = create_string_buffer(MAX_STR)
ret = dll.get_camera_info(desc,sn,mfg)
print(desc.value.decode(),sn.value.decode(),mfg.value.decode())
输出:
Description 12345678 Manufacturer
请注意,
.value
返回缓冲区开头的字节字符串,直到第一个空字节为止(不包括空字节)。
.raw
将输出一个包含缓冲区每个字节的字节字符串。
.decode()
使用UTF-8作为默认编码将字节字符串转换为Unicode字符串。
string_buffer = create_string_buffer(256)
,创建3个这样的缓冲区,并将它们作为参数传递给函数。 - PaulMcKenzie