Python ctypes参数错误

14

我用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)

我做错了什么?谢谢。

1个回答

22

你可能把调用约定搞混了。我猜你有一个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)。这种更改对现有代码影响最小。


非常顺利,谢谢David提供的所有帮助!一旦stackoverflow允许,我会选择您的问题作为最佳答案。 - pajm
谢谢。在你上一个问题之后,我一直在等待这个问题。我预计这会是这样的,但分开提问更好。这样更整洁。 - David Heffernan
没问题!你真是救星,我以前从未处理过这样的事情,而且我对Python也很陌生... - pajm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接