gpt4 book ai didi

python - 如何为 DLL 库创建 Python 包装器

转载 作者:可可西里 更新时间:2023-11-01 10:21:54 27 4
gpt4 key购买 nike

我正在尝试从软件 SDK 中获取提供的 DLL 文件并创建一个 python 包装器,以便将其与我的其余代码库集成。我在网上遵循了很多指南,但仍然没有运气。

我目前的 Python 代码是:

from ctypes import *
from ctypes.wintypes import HWND
import os

class OptistarDLL(object):
dll_path = 'OSDS142MRT.dll'

with open(dll_path) as thefile:
pass

_dll = WinDLL(dll_path)

init_library = _dll['OSDS142M_Initialize']
init_library.restype = c_int
init_library.argtypes = (c_int, c_bool, HWND, c_bool, c_int)


class OpticstarControl(object):

def __init__(self):
err = OptistarDLL.init_library(c_int(0), c_bool(False), HWND(0), c_bool(False), c_int(0))
if err != 0:
raise Exception("Doom")

我使用的 SDK 文档将其作为函数的 header 提供:

DLLDIR int OSDS142M_Initialize(int iModel, bool bOutVid, HWND hwOutVid, bool bStarView, int iRt);

示例 PDF 给出:

OSDS142M_Initialize(1, false, 0, true, 0);

初始化目前只得到我

ValueError: Procedure probably called with too many arguments (20 bytes in excess)

我读过,但不明白,关于 WinDLLCDLL,当我改成 CDLL 时,DLL 加载失败.我还在所有指南中看到它们中的 header 有 DLLEXPORT 而我的有 DLLDIR,我不知道这是否是一个问题。

有没有人有什么想法?


ctypes documentation
WinDLL examples

最佳答案

根据问题中的信息,最可能的解释是 DLL 使用 cdecl 而不是 stdcall。您对 WinDLL 的使用与 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 不存在,您很快就会遇到故障。

关于python - 如何为 DLL 库创建 Python 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26423985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com