如何为DLL库创建Python包装器

如何为DLL库创建Python包装器,python,windows,dll,wrapper,ctypes,Python,Windows,Dll,Wrapper,Ctypes,我试图从软件SDK中获取一个提供的DLL文件,并创建一个python包装器,以便将其与我的其余代码库集成。我在网上跟随了不少导游,但仍然没有运气 我目前拥有的Python代码是: 从ctypes导入* 从ctypes.wintypes导入HWND 导入操作系统 类OptistarDLL(对象): dll_path='OSDS142MRT.dll' 打开(dll\U路径)作为文件: 通过 _dll=windl(dll\u路径) 初始化库=_dll['OSDS142M_初始化'] init_libr

我试图从软件SDK中获取一个提供的DLL文件,并创建一个python包装器,以便将其与我的其余代码库集成。我在网上跟随了不少导游,但仍然没有运气

我目前拥有的Python代码是:

从ctypes导入*
从ctypes.wintypes导入HWND
导入操作系统
类OptistarDLL(对象):
dll_path='OSDS142MRT.dll'
打开(dll\U路径)作为文件:
通过
_dll=windl(dll\u路径)
初始化库=_dll['OSDS142M_初始化']
init_library.restype=c_int
init_library.argtypes=(c_int、c_bool、HWND、c_bool、c_int)
类OpticstarControl(对象):
定义初始化(自):
err=OptistarDLL.init_库(c_int(0)、c_bool(False)、HWND(0)、c_bool(False)、c_int(0))
如果出错!=0:
引发异常(“厄运”)
我使用的SDK文档将此作为函数的标题:

DLLDIR intosds142m_初始化(intimodel、bool bOutVid、HWND hwOutVid、bool bStarView、intirt);
示例PDF给出了:

OSDS142M_Initialize(1, false, 0, true, 0);
目前,我只需要初始化

ValueError: Procedure probably called with too many arguments (20 bytes in excess)
我已经阅读了
windle
CDLL
的相关内容,但尚未理解,当我更改为
CDLL
时,DLL加载失败。我也在所有的指南中看到,其中的标题有
DLLEXPORT
,而我的标题有
DLLDIR
,我不知道这是否是一个问题


有人有什么想法吗?

根据问题中的信息,最可能的解释是DLL使用
cdecl
而不是
stdcall
。您使用的
windell
stdcall
DLL匹配。使用
CDLL
切换到
cdecl
呼叫约定

错误消息与此一致。调用约定之间的区别在于
stdcall
具有被调用方堆栈清理功能,
cdecl
具有调用方清理功能。这些参数消耗堆栈上的20个字节,共5个参数,大小均为4。ctypes将这些参数推上并期望被调用方清理堆栈。它没有这样做,因为它是一个
cdecl
函数

对函数的调用不必要地复杂。你可以写:

err = OptistarDLL.init_library(0, False, 0, False, 0)
请注意,您引用的示例调用传递了不同的参数。要匹配该呼叫,您可以写:

err = OptistarDLL.init_library(1, False, 0, True, 0)
您当然应该删除此代码:

with open(dll_path) as thefile:
    pass

除了浪费时间外,那没有别的用处。如果DLL不存在,您很快就会遇到故障。

Hi David,当尝试通过
CDLL
调用时,我得到的返回代码是13。然而,从方法实际被调用的意义上讲,实例化似乎并没有以与使用
windl
相同的方式失败。因此,我认为这可能是一个图书馆的问题,所以我将与Opticstar讨论。是的。返回代码13听起来像是互操作现在是正确的。