Python ctypes 参数错误
我写了一个测试用的dll(动态链接库),用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
)。这样改动的影响最小。