我试图从我的Python代码中调用dll中的一个简单函数,使用QtCreator构建,问题是参数大小始终无效。
我的 test.h ( test.cpp 为空):
#ifndef TEST_H
#define TEST_H
#include "test_global.h"
extern "C"
{
int TESTSHARED_EXPORT si () { return sizeof(int);}
int TESTSHARED_EXPORT add4 ( int i) { return i + 4;}
}
#endif // TEST_H
它构建为test.dll,我可以加载:
tdll = windll.LoadLibrary(r'X:\TMP\SRC\build-test-Desktop_Qt_5_1_1_MinGW_32bit-Release\release\test.dll')
调用print tdll.si()
按预期打印4,
但是对tdll.add4(1)
的所有调用均失败并显示错误:
Traceback (most recent call last):
File "test.py", line 29, in <module>
print tdll.add4(2)
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
如果我将add4
参数包装到c_int, c_uint, c_int32
或ctypes提供的任何其他*int
类型中,也会发生同样的事情。
请帮我解决这个问题。 谢谢!
答案 0 :(得分:2)
这些是调用约定不匹配的症状。可能导出的函数是__cdecl
,但您的ctypes代码使用__stdcall
。你的问题没有足够的信息让我确定,但它很可能并且确实解释了报告的行为。
使用cdll
代替windll
解决不匹配问题。使用windll
会导致__stdcall
被使用,使用cdll
会导致__cdecl
被使用。