【问题标题】:Python ctypes argument errorsPython ctypes 参数错误
【发布时间】:2011-07-13 03:38:41
【问题描述】:

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

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)

我做错了什么?谢谢。

【问题讨论】:

    标签: python dll ctypes


    【解决方案1】:

    您可能混淆了调用约定。我猜你有一个像这样声明的 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)。这种变化的影响最小。

    【讨论】:

    • 工作就像一个魅力,感谢大卫的所有帮助!只要 stackoverflow 允许,我就会选择您的问题作为最佳问题。
    • 谢谢。在你的最后一个问题之后,我一直在等待这个。我预计会是这样,但在单独的问题中会更好。这样更整洁。
    • 没问题!你是救生员,我以前从未处理过这样的事情,而且我还是 python 新手......
    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多