Python ctypes 参数错误

标签 python dll ctypes

我用 C++ 编写了一个测试 dll,以确保在我开始使用我需要的更重要的 dll 之前一切正常。基本上它需要两个 double 并将它们相加,然后返回结果。我一直在玩弄其他测试功能,我已经恢复工作,但由于错误我无法传递参数。 我的代码是:

import ctypes
import string

nDLL = ctypes.WinDLL('test.dll')
func = nDLL['haloshg_add']
func.restype = ctypes.c_double
func.argtypes = (ctypes.c_double,ctypes.c_double)
print(func(5.0,5.0))

它返回调用“func”的行的错误:

ValueError: Procedure probably called with too many arguments (8 bytes in excess)

我做错了什么?谢谢。

最佳答案

您可能混淆了调用约定。我猜你有一个声明如下的 C 函数:

double haloshg_add(double d1, double s2)
{
    return d1+d2;
}

这将默认使用 C 调用约定。最简单的方法是更改​​ ctypes 代码中的调用约定:

nDLL = ctypes.CDLL('test.dll')

如果您想将 C 代码中的调用约定更改为 stdcall(以匹配 ctypes.WinDLL),那么您可以这样做:

double __stdcall haloshg_add(double d1, double s2)

无论您做什么,只做其中一项更改。如果你同时做这两件事,你会遇到相反的失败!

如果是我,我只会更改 Python 代码以使用 C 调用约定(使用 CDLL)。这种变化的影响最小。

关于Python ctypes 参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267434/

相关文章:

python - 从 Python 模块中的 nosetests 获取测试结果

python - 如何转换为 "end-of-month"?

java - 将 Java 中的 C++ DLL 与 JNA 结合使用

c++ - 查询的类成员返回错误值

python - 指向 Ctypes 中的 c_int16 数组缓冲区的指针

python - 如何在 python 运行时捕获断言(由 C++ 引起)

python - 如何使用 View 中的列表在 Django 中创建下拉列表

python - 使用 Python 将一个 .csv 中的列添加到另一个 .csv 文件

c++ - 如何修复 "faulting module msvcr100.dll"

python - 避免模​​ block 名称修改的干净方法?