将指针从python变量传递到c库

将指针从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

我有一个固定的C库作为DLL文件。DLL文件有一些安全函数,这就是为什么我不能查看库的原因。我只知道函数名和需要的数据类型

我需要给函数一个指针,指向Python中的var,内存中的地址。我尝试使用ctypes,但它不起作用。用于加载库。我使用ctypes

这是一个包含我需要启动的所有变量的函数

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)),但仍然没有更改