2015-04-23 23 views
6

Tôi muốn gọi hàm bên trong một DLL từ Python. Nhưng tôi nhận được lỗi này:Gọi hàm DLL từ Python

"Attribute Error function not found" 

Đây là mã của tôi:

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) 

nhưng tài liệu DLL cho thấy một hàm setDACValue với ChannelId & DAC Voltage như đầu vào.

Ở trên dựa trên một đoạn mã có sẵn từ StackOverflow.

Tôi cũng đã thử phương pháp đơn giản khi sử dụng cdll.LoadLibrary & rồi gọi hàm, nhưng điều đó cũng cho cùng một lỗi.

Có ai có thể đề xuất tôi điều gì sai không? Cảm ơn.

Full 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

Bạn có thể cung cấp chữ ký của hàm 'setDACValue'? – kvorobiev

+0

Hi kvorobiev ..added chữ ký .. – user3561075

Trả lời

2

Khi bạn thể chỉ định nguyên mẫu của chức năng bạn nên xác định không chỉ có các loại của các đối số, nhưng các kiểu trả về như arg đầu tiên WINFUNCTYPE. Do đó, dòng

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

nên được thay thế bằng

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

Hi @kvorobiev cảm ơn cho đầu vào của bạn ... Nhưng ngay cả sau khi thêm đó là nhận được cùng một lỗi. – user3561075

+0

@ user3561075 Cố gắng sử dụng 'CFUNCTYPE' thay vì' WINFUNCTYPE' – kvorobiev

+0

Nope.Still không hoạt động. – user3561075

0

Hãy thử điều này. Bạn có thể cần phải sử dụng WinDLL, nhưng CDLL có nhiều khả năng:

from ctypes import * 

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

cats.setDACValue(1,4) 

Nếu nó vẫn không thể tìm thấy setDACValue, công cụ Microsoft dumpbin có thể được sử dụng để liệt kê tên các chức năng xuất khẩu trong DLL:

dumpbin /exports CATS.dll 

Nó đi kèm với cài đặt Visual Studio trong thư mục VC \ bin trong quá trình cài đặt.

+0

Xin chào @Mark Tolonen: Tôi đã cố gắng xuất các hàm bên trong DLL bằng cách sử dụng công cụ Xuất DLL và PE Explorer. Tôi không thể có được các chức năng trong cả hai công cụ đó. – user3561075

Các vấn đề liên quan