2015-04-23 9 views
6

Chcę wywołać funkcję wewnątrz DLL z Python. Ale ja dostaję ten błąd:Wywołanie funkcji DLL z Python

"Attribute Error function not found" 

To jest mój kod:

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) 

ale dokumentacja DLL pokazuje funkcję setDACValue z ChannelId & DAC Voltage jak wejść.

Powyższe opiera się na kodzie dostępnym w StackOverflow.

Próbowałem również prosty sposób korzystania z cdll.LoadLibrary &, a następnie wywołanie funkcji, ale to daje ten sam błąd.

Czy ktoś może mi zasugerować, co jest nie tak? Dzięki.

Pełna Traceback:

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

Czy możesz podać podpis funkcji 'setDACValue'? – kvorobiev

+0

Cześć kvorobiev ..Podpisałem podpis .. – user3561075

Odpowiedz

2

Kiedy specifiy prototyp funkcji należy określić nie tylko rodzaje argumentów, ale typ zwracany jako pierwszy arg WINFUNCTYPE. Dlatego linia

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

należy zastąpić

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

Witam @kvorobiev dzięki za twoje wejście ... Ale nawet po dodaniu, że otrzymuję ten sam błąd. – user3561075

+0

@ user3561075 Spróbuj użyć 'CFUNCTYPE' zamiast' WINFUNCTYPE' – kvorobiev

+0

Nope.Still nie działa. – user3561075

0

Spróbuj tego. Może trzeba użyć WinDLL, ale CDLL jest bardziej prawdopodobne:

from ctypes import * 

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

cats.setDACValue(1,4) 

Jeśli nadal nie może znaleźć setDACValue narzędzie Microsoft dumpbin mogą być wykorzystane do listy eksportowanych nazw funkcji w DLL:

dumpbin /exports CATS.dll 

Jest dostarczana z instalacją Visual Studio w katalogu VC \ bin pod instalacją.

+0

Witam @Mark Tolonen: Próbowałem wyeksportować funkcje wewnątrz biblioteki DLL przy użyciu narzędzia do eksportowania DLL i PE Explorer. Nie jestem w stanie uzyskać funkcji w żadnym z tych narzędzi. – user3561075