从Python调用DLL函数

6
我想从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文档显示了一个使用通道ID和DAC电压作为输入的setDACValue函数。
以上内容基于来自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

Signature of the setDACValue


你能提供setDACValue函数的签名吗? - kvorobiev
嗨,kvorobiev,已添加签名。 - user3561075
2个回答

2

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

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

应该被替换为

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

嗨@kvorobiev,感谢您的意见...但即使我添加了那个,我仍然得到相同的错误。 - user3561075
@user3561075 尝试使用 CFUNCTYPE 而不是 WINFUNCTYPE - kvorobiev
@user3561075,您能否附上您的DLL文件,以便我可以检查它? - kvorobiev
我可以附上DLL文件,但问题是它依赖于一些额外的文件,这些文件是软件安装的一部分。如果我们有文件共享选项,我可以分享该软件、DLL以及文档。 - user3561075
@user3561075 首先,我只需要 DLL 文件。您可以使用任何文件共享服务。 - kvorobiev
让我们在聊天中继续这个讨论。点击此处进入聊天室 - user3561075

0

试一下这个。你可能需要使用 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 Export工具和PE Explorer导出DLL内部的函数,但是在这些工具中都无法获取到这些函数。 - user3561075

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接