如何为DLL库创建Python包装器
我试图从软件SDK中获取一个提供的DLL文件,并创建一个python包装器,以便将其与我的其余代码库集成。我在网上跟随了不少导游,但仍然没有运气 我目前拥有的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
从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听起来像是互操作现在是正确的。