将参数传递给加载了ctypes的dll中的函数

时间:2015-10-28 19:14:34

标签: python dll ctypes

我试图从我的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类型中,也会发生同样的事情。

请帮我解决这个问题。 谢谢!

1 个答案:

答案 0 :(得分:2)

这些是调用约定不匹配的症状。可能导出的函数是__cdecl,但您的ctypes代码使用__stdcall。你的问题没有足够的信息让我确定,但它很可能并且确实解释了报告的行为。

使用cdll代替windll解决不匹配问题。使用windll会导致__stdcall被使用,使用cdll会导致__cdecl被使用。