将指针从 python var 传递到 c lib
passing pointer from python var to c lib
我有一个固定的 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 是错误的。我不知道如何将指针地址发送给函数。
参数 bigarray 在函数签名中声明 const unsigned char *
。如果这是正确的,那么 bigarray 变量改变的可能性很小。
编辑
总结评论,这是一个有希望的工作示例,给出了原始函数签名。
# 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,它是您函数的输出。请注意,这里存在明显的缓冲区溢出风险。
我有一个固定的 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 是错误的。我不知道如何将指针地址发送给函数。
参数 bigarray 在函数签名中声明 const unsigned char *
。如果这是正确的,那么 bigarray 变量改变的可能性很小。
编辑 总结评论,这是一个有希望的工作示例,给出了原始函数签名。
# 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,它是您函数的输出。请注意,这里存在明显的缓冲区溢出风险。