2015-04-23 147 views
6

我想從Python中調用DLL中的函數。但我發現了這個錯誤:從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文件顯示了ChannelId & DAC Voltage作爲輸入的功能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

+0

您能否提供函數'setDACValue'的簽名? – kvorobiev

+0

您好kvorobiev ..添加簽名.. – user3561075

回答

2

當你specifiy的函數原型應指定不僅類型的參數,但返回類型爲第一個參於WINFUNCTYPE。因此,該行

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

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

您好@kvorobiev感謝您的輸入...但即使添加後,得到相同的錯誤。 – user3561075

+0

@ user3561075嘗試使用'CFUNCTYPE'而不是'WINFUNCTYPE' – kvorobiev

+0

Nope.Still不起作用。 – 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目錄中。

+0

嗨@Mark Tolonen:我試圖使用DLL導出工具&PE Explorer導出DLL中的函數。我無法在這兩種工具中都獲得這些功能。 – user3561075