当前位置: 首页 > 面试题库 >

如何使用Python中的DLL文件?

裴欣然
2023-03-14
问题内容

DLL从内部使用文件的最简单方法是什么Python

具体来说,如何在不编写任何其他包装程序C++代码的情况下完成此功能Python

Python与使用第三方库相比,本机功能是首选。


问题答案:

为了易于使用,ctypes是必经之路。

以下ctypes示例来自我编写的实际代码(在Python 2.5中)。到目前为止,这是我找到的最简单的方法来完成你的要求。

import ctypes

# Load DLL into memory.

hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")

# Set up prototype and parameters for the desired function call.
# HLLAPI

hllApiProto = ctypes.WINFUNCTYPE (
    ctypes.c_int,      # Return type.
    ctypes.c_void_p,   # Parameters 1 ...
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.c_void_p)   # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),

# Actually map the call ("HLLAPI(...)") to a Python name.

hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)

# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.

p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))

的ctypes东西具有:(所有的C型的数据类型int,char,short,void*,等等),并且可以通过数值或引用传递。尽管我的示例没有这样做,但它也可以返回特定的数据类型(HLL API通过修改引用传递的变量来返回值)。

就上面显示的特定示例而言,IBM的EHLLAPI是一个相当一致的接口。

所有呼叫传递四个空指针(EHLLAPI将通过第四个参数的指针返回代码回来,一个int是这样,而我指定int的返回类型,我可以放心地忽略它),按照IBM的文档在这里。换句话说,该函数的C变体为:

int hllApi (void *p1, void *p2, void *p3, void *p4)

这使得一个简单的ctypes函数可以执行EHLLAPI库提供的任何功能,但是其他库可能需要为ctypes每个库函数设置一个单独的函数。

从的返回值WINFUNCTYPE是一个函数原型,但是你仍然必须设置更多的参数信息(类型之外)。每个元组中hllApiParams都有一个参数“方向”(1 =输入,2 =输出,依此类推),一个参数名称和一个默认值- ctypes有关详细信息,请参见doco

一旦有了原型和参数信息,就可以创建一个Python“可调用” hllApi函数来调用该函数。你只需创建(所需的变量p1通过p4在我的情况),并调用函数与他们。



 类似资料:
  • 问题内容: 我正在使用ctypes在Python中加载DLL。这很好。 现在,我们希望能够在运行时重新加载该DLL。 直接的方法似乎是:1.卸载DLL 2.加载DLL 不幸的是,我不确定卸载DLL的正确方法是什么。 _ctypes.FreeLibrary可用,但私有。 还有其他卸载DLL的方法吗? 问题答案: 您应该能够通过放置对象来做到这一点 编辑: 霍普的评论是正确的,这取消了名称的绑定,但是

  • 问题内容: 我有一个.dll文件,必须在Java中使用。该.dll文件具有参数化方法,该方法应将类型返回为字符串。当我将参数传递给它时,我得到的消息是 这是代码… 问题答案: 只需在项目中添加引用即可。和名称空间在顶部..然后您可以访问所有dll方法。如果您使用的是Eclispe,请右键单击您的项目->然后单击“构建路径”->,然后单击“添加库”,然后单击用户库。 在这里您可以导入dll

  • 我是VST开发的新手。我想实现http://www.cloneensemble.com/比如C#中的功能。这是一个VST插件。 有两种方法可以做到这一点。 在我的项目中使用他们的DLL,通过调用DLL的一些函数并对输入应用效果,以某种方式为DLL提供输入 以上任何一种情况我都不知道怎么做请帮忙。

  • 问题内容: 我正在研究一个散布一堆jython和Java代码的应用程序。由于程序的性质(使用wsadmin),我们实际上仅限于Python 2.1 当前,我们有一个同时包含Java源代码和.py模块的jar。该代码当前是使用java调用的,但我希望删除此代码,以便将尽可能多的功能迁移到jython。 我的问题是我想从调用的jython脚本中导入或执行现有jar文件中的python模块。我尝试了几种

  • 本文向大家介绍如何使用python读取Selenium中的文本文件?,包括了如何使用python读取Selenium中的文本文件?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过先创建一个txt文件并在其中包含内容,来使用python阅读Selenium中的文本文件。 首先,我们需要打开文件并提及文本文件位置的路径作为参数。有多种读取方法可以执行这些操作。 read() –读取文件的全部内容

  • 问题内容: 通常,通过在与可执行文件一起存在的清单文件中指定DLL依赖关系来完成此操作。但是,我不知道如何在Python中完成此操作。加载DLL并不是问题,但是要在SXS中找到合适的DLL来加载才是问题。 是否有用于指定在哪里找到DLL的标准过程?对于此示例,我们假设它位于此处: 我是否真的需要手动搜索目录以按名称查找我的DLL,然后检查父目录以查看其是否包含正确的版本? 我只是没有做足够的Pyt