_cdecl和_stdcall是两种不同的函数调用方式,主要区别在于参数入栈顺序、传入方式、清理栈帧的操作对象等,具体细节可查阅相关资料。
dll文件中函数的不同声明方式也决定了python加载dll的不同方式
1. _cdecl
test.dll中存在一个函数 _cdecl void fun()
# 加载test.dll
In [1]: import ctypes
In [2]: dll_obj = ctypes.cdll.LoadLibrary("test")
# 调用函数
In [3]: dll_obj.fun()
2. _stdcall,windows中编写函数时默认方式
test.dll中存在一个函数 _stdcall void fun()
# 加载 test.dll
In [1]: import ctypes
In [2]: dll_obj = ctypes.windll.LoadLibrary("test")
# 调用函数
In [3]: dll_obj.fun()
dll_obj会自动释放dll文件,如果需要主动释放,可借助pywin32模块中的win32api.FreeLibrary,可参考python——释放*.dll
ctypes官方详细文档地址:
https://docs.python.org/zh-cn/3/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference