【问题标题】:Calling a DLL function from Python从 Python 调用 DLL 函数
【发布时间】:2015-04-23 13:21:45
【问题描述】:

我想从 Python 调用 DLL 中的函数。但我收到了这个错误:

"Attribute Error function not found"

这是我的代码:

import os
import ctypes


os.chdir("C:\\Program Files\\Compact Automated Testing System V2.0")    

# Load DLL into memory. 
CATSDll = ctypes.WinDLL ("CATS.dll")

# Set up prototype and parameters for the desired function call. 
CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8,ctypes.c_double) 

CATSDllApiParams = (1, "p1", 0), (1, "p2", 0), 

# Actually map the call (setDACValue) to a Python name.
CATSDllApi = CATSDllApiProto (("setDACValue", CATSDll), CATSDllApiParams)

# Set up the variables and call the Python name with them. 
p1 = ctypes.c_uint8 (1)
p2 = ctypes.c_double (4)

CATSDllApi(p1,p2)

但 DLL 文档显示了一个函数 setDACValue,其中 ChannelIdDAC Voltage 作为输入。

以上内容基于 StackOverflow 提供的一段代码。

我也尝试过使用 cdll.LoadLibrary & 然后调用函数的简单方法,但这也给出了同样的错误。

谁能告诉我什么是错的?谢谢。

完整追溯:

Traceback (most recent call last):
  File "C:\Users\AEC_FULL\Softwares\eclipse\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydevd.py", line 2235, in <module>
    globals = debugger.run(setup['file'], None, None)
  File "C:\Users\AEC_FULL\Softwares\eclipse\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydevd.py", line 1661, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Users\AEC_FULL\Saravanan\Workspace\CATS\CATS.py", line 18, in <module>
    CATSDllApi = CATSDllApiProto (("setDACValue", CATSDll), CATSDllApiParams)
AttributeError: function 'setDACValue' not found

【问题讨论】:

  • 能否提供setDACValue函数的签名?
  • 嗨 kvorobiev ..添加了签名..

标签: python dll


【解决方案1】:

当你指定函数的原型时,你不仅应该指定参数的类型,还应该指定返回类型作为WINFUNCTYPE 的第一个参数。因此,行

CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8,ctypes.c_double)

应该替换为

CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8, ctypes.c_uint8,ctypes.c_double)

【讨论】:

  • 嗨@kvorobiev 感谢您的意见......但即使添加了这个'我得到了同样的错误。
  • @user3561075 尝试使用CFUNCTYPE 而不是WINFUNCTYPE
  • @user3561075 能否附上你的 DLL 文件,以便我检查一下?
  • 我可以附加 DLL 文件,但问题是它依赖于一些附加文件,这些文件是软件安装的一部分。如果我们有一些文件共享选项,我可以共享该 SW、DLL 以及文档。
  • @user3561075 首先我只需要 DLL 文件。您可以使用任何文件共享服务
【解决方案2】:

试试这个。您可能需要使用WinDLL,但CDLL 更有可能:

from ctypes import *

cats = CDLL('CATS')
cats.setDACValue.argtypes = [c_uint8,c_double]
cats.setDACValue.restype = c_uint8

cats.setDACValue(1,4)

如果还是找不到setDACValue,可以使用微软工具dumpbin列出DLL中导出的函数名:

dumpbin /exports CATS.dll

自带Visual Studio安装在VC\bin目录下安装。

【讨论】:

  • 嗨@Mark Tolonen:我尝试使用 DLL 导出工具和 PE Explorer 导出 DLL 中的函数。我无法使用这两种工具中的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多