Để dễ sử dụng, ctypes là cách để đi.
Ví dụ sau đây về ctypes là từ mã thực tế tôi đã viết (bằng Python 2.5). Đây là cách dễ nhất mà tôi đã tìm thấy để làm những gì bạn yêu cầu.
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
Các ctypes
thứ có tất cả các loại C-kiểu dữ liệu ( int
, char
, short
, void*
, và vân vân) và có thể vượt qua bởi giá trị hoặc tham khảo. Nó cũng có thể trả về các loại dữ liệu cụ thể mặc dù ví dụ của tôi không làm điều đó (API HLL trả về các giá trị bằng cách sửa đổi một biến được truyền bằng tham chiếu).
Xét về ví dụ cụ thể được trình bày ở trên, EHLLAPI của IBM là một giao diện khá nhất quán.
Tất cả các cuộc gọi đều vượt qua bốn con trỏ void (EHLLAPI gửi mã trả về qua tham số thứ tư, một con trỏ tới int
, trong khi tôi chỉ định int
là kiểu trả về, tôi có thể bỏ qua nó một cách an toàn) theo tài liệu của IBM ở đây . Nói cách khác, biến thể C của hàm sẽ là:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Điều này làm cho một ctypes
chức năng đơn giản có thể làm bất cứ điều gì mà thư viện EHLLAPI cung cấp, nhưng có khả năng các thư viện khác sẽ cần một ctypes
chức năng riêng được thiết lập cho mỗi chức năng thư viện.
Giá trị trả về từ WINFUNCTYPE
là một nguyên mẫu hàm nhưng bạn vẫn phải thiết lập thêm thông tin tham số (hơn và hơn các loại). Mỗi bộ trong hllApiParams
có một tham số "hướng" (1 = đầu vào, 2 = đầu ra, v.v.), tên tham số và giá trị mặc định - xem tài liệu ctypes
để biết chi tiết
Khi bạn có thông tin về nguyên mẫu và tham số, bạn có thể tạo Python "có thể gọi được" hllApi
để gọi hàm. Bạn chỉ cần tạo biến cần thiết ( p1
thông qua p4
trường hợp của tôi) và gọi hàm với chúng.