将指针从python变量传递到c库
我有一个固定的C库作为DLL文件。DLL文件有一些安全函数,这就是为什么我不能查看库的原因。我只知道函数名和需要的数据类型 我需要给函数一个指针,指向Python中的var,内存中的地址。我尝试使用ctypes,但它不起作用。用于加载库。我使用ctypes 这是一个包含我需要启动的所有变量的函数将指针从python变量传递到c库,python,c,pointers,ctypes,extern,Python,C,Pointers,Ctypes,Extern,我有一个固定的C库作为DLL文件。DLL文件有一些安全函数,这就是为什么我不能查看库的原因。我只知道函数名和需要的数据类型 我需要给函数一个指针,指向Python中的var,内存中的地址。我尝试使用ctypes,但它不起作用。用于加载库。我使用ctypes 这是一个包含我需要启动的所有变量的函数 function ( const unsigned char* input_array, unsigned int multiply_by, unsigned char* output_arra
function (
const unsigned char* input_array,
unsigned int multiply_by,
unsigned char* output_array
);
因此,我用Python初始化变量,如下所示:
input_array = "100"
multiply_by = 5
output_array = "000"
之后,我加载我的lib并启动函数
lib = CDLL('func_lib.dll')
lib.function( hex(id(input_array)),
multiply_by,
hex(id(output_array))
)
该函数不会改变变量输出数组,这是它的目标。我可以看到调用该函数是因为没有调用错误。我把指针处理错了吗
编辑:我将函数简化为3个变量,更多情况下也是如此。此外,我认为输入_数组是问题所在。被调用的函数会给我一个反馈代码,上面说输入数组是错误的。我不知道如何向函数发送指针地址。参数bigarray在函数签名中声明为
const unsigned char*
。如果这是正确的,那么bigarray变量很少有机会更改
lib = CDLL('func_lib.dll')
lib.function( hex(id(input_array)),
multiply_by,
hex(id(output_array))
)
编辑
为了总结注释,这里是一个有希望的工作示例,给出了原始函数签名
# Load the lib
lib = CDLL('func_lib.dll')
# Defines signature, based on C one
lib.function.argtypes = [ c_char_p, c_uint, c_char_p ]
# Call parameters
data_in = b'Sample input'
data_out = create_string_buffer(16)
# Call
lib.function(data_in, 16, data_out)
这里的一个猜测是,我假设第二个参数是缓冲区大小,因此在示例调用中,我给出了与create\u string\u buffer
相同的值这里需要调用create_string_buffer,因为它是函数的输出。注意这里存在明显的缓冲区溢出风险。那么你的意思是问题在于“const”?我给函数一个指向python数组开头的指针,该数组不应该受到保护,还是我错了?我的意思是,如果函数签名是正确的,那么函数不应该修改第一个参数。你从DLL文档中得到签名了吗?还是猜到了?thx你是对的,我发错了。我在我的帖子上做了一个编辑,我认为使用
hex(…)
不会给你预期的结果。对于输入和输出参数,我想您需要使用ctypes'byref()
(请参阅)或使用c\u char\u p
类型。我尝试像“c\u char\u p(input\u array)”一样使用它,但这样我得到一个错误,即:需要字节或整数地址,所以我尝试了,制作一个c变量:“c\u input\u array=c\u wchar\u p(“100”)”并使用“c\u char\u p(addressof”)(c_input_array)),但仍然没有更改