Python,何时使用 ctypes.byref 作为引用传递

标签 python c dll ctypes

我从第三方 DLL 加载了一个函数。我已经通过 ctypes.windll.LoadLibrary 成功访问了作为库入口点的函数。该函数有 30 个参数,其中包括许多二维数组。函数原型(prototype)指定在大多数情况下参数通过引用传递。当我进行函数调用时,我收到一个返回代码,表明内部变量存在问题,这让我认为我传递了错误的指针。 (这很模糊。)我的问题是,在什么情况下应该使用 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 的代码。

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

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

谢谢

最佳答案

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

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

那么人们通常可以认为值得尝试以下操作

传递参数如下: 通过引用输入 按值(value)指标 dmatrix 通过引用 按引用分组

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

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

当然,这在某种程度上是一个猜测,所以其中一些是经过考验的……

关于Python,何时使用 ctypes.byref 作为引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472708/

相关文章:

python - 如何创建具有函数特殊(dunder)属性的 Mock

c++ - 使用 C/C++ 制作球体上的点、线和多边形

c - OpenGL + SDL2 + 计算着色器 = 黑屏

.net - Oracle DataAccess - 找不到入口点

c++ - ctypes wintypes WCHAR 字符串 附加空格

python - 为什么 dir() 函数未列出某些可调用属性?

python - 如何使用Python3在PyCharm中编写多个签名提示

c - 使用 getchar() 的简单 C 计算器 - 第二个操作数不正确

c++ - 如果我发布一个使用 IPP 库的 DLL,我是否也应该发布 IPP DLL?

python - 为什么 sys.getdefaultencoding() 与 sys.stdout.encoding 不同?这如何破坏 Unicode 字符串?