1

我从第三方 DLL 加载了一个函数。我已经成功访问​​了作为库入口点的函数ctypes.windll.LoadLibrary。该函数有 30 个参数,包括许多二维数组。函数原型指定在大多数情况下通过引用传递参数。当我进行函数调用时,我得到一个返回代码,表明内部变量存在问题,这让我认为我传递了错误的指针。(含糊不清。)我的问题是,在什么情况下我应该使用ctypes.byref作为参考传递。例如,假设我有以下内容:

double_matrix = (ctypes.c_double * 100) * 100
my_array = double_matrix()

我应该传递 my_array 还是 ctypes.byref(my_array)?

my_string = ctypes.create_string_buffer("Hello world!")

使用 types.create_string_buffer() 创建的对象呢?如果需要通过引用传递,我应该传递 my_string 还是 ctypes.byref(my_string) ?

编辑:

我没有 DLL 的代码。

函数原型看起来基本上是这样的,只是每种类型大约有 5 或 6 个。

int process(char *input, int 指标, double (*dmatrix)[100][100], int (*groups)[100]);

谢谢

4

1 回答 1

0

通常,如果您的原型如下所示:

int process(char *input, int indicator, double (*dmatrix)[100][100], int (*groups)[100]);

那么人们通常可以假设它值得尝试以下

传递参数如下:按参考输入指标按值dmatrix按参考组按参考

一般来说,假设原型是 ac 函数,并且你指的是 python 的 ctypes;处理函数期望您传递以下参数的地址引用:输入、dmatrix 和组。另一方面,指标变量作为直接值传递。当通过引用传递参数时,通常意味着接收函数可以更改值,并且无论进行任何更改,调用者都将能够直接分析更改(因为它们都共享相同的特定地址空间)。

如果我必须一遍又一遍地传递 30 个参数,我会想出一个桥接函数将它们全部打包到一个适合函数目标参数列表结构的结构中,然后简单地调用该函数。然后在从桥接功能出来的路上解压结果(如果有的话)。

当然,这在某种程度上是一种猜测,所以其中一些是一场试炼……

于 2013-12-12T15:17:25.173 回答