【问题标题】:passing pointer from python var to c lib将指针从 python var 传递给 c lib
【发布时间】:2020-05-29 05:09:06
【问题描述】:

我有一个固定的 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 = CDLL('func_lib.dll')
lib.function( hex(id(input_array)),
                 multiply_by,
                 hex(id(output_array))
             )

函数不会改变变量 output_array,这是它的目标。我可以看到该函数被调用,因为没有调用错误。我是不是处理错了指针?

编辑:我将函数简化为 3 个变量,更多变量也是一样的。我也认为 input_array 是问题所在。被调用的函数给我一个反馈代码,上面写着 input_array 是错误的。我不知道如何将指针地址发送给函数。

【问题讨论】:

    标签: python c pointers ctypes extern


    【解决方案1】:

    参数 bigarray 在函数签名中声明为const unsigned char *。如果这是正确的,那么 bigarray 变量改变的可能性很小。

    编辑 总结一下 cmets,这是一个有希望的工作示例,给出了原始函数签名。

        # 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_string_buffer 相同的值。
    这里需要调用 create_string_buffer,它是你的函数的输出。请注意,这里存在明显的缓冲区溢出风险。

    【讨论】:

    • 所以你的意思是问题是“const”?我给函数一个指针,指向一个不应该受到保护的python数组的开头,还是我错了?
    • 我的意思是如果函数签名是正确的,那么第一个参数不应该被函数修改。您是否从 DLL doc 获得签名?还是猜到了?
    • 谢谢你是对的,我确实发错了。我对我的帖子进行了编辑
    • 我不认为使用hex(...) 会给你预期的结果。对于输入和输出参数,我猜您需要使用 ctypes 的 byref()(参见 docs.python.org/2/library/…)或使用 c_char_p 类型。
    • 我尝试像 'c_char_p(input_array)' 一样使用它,但是这样我得到一个错误,上面写着:字节或整数地址,所以我尝试了,使 ac var: 'c_input_array = c_wchar_p("100 ")' 并在我的函数中使用 'c_char_p(addressof(c_input_array))',但仍然没有变化
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多