Untuk kemudahan penggunaan, ctypes adalah cara yang harus dilakukan.
Contoh ctypes berikut ini dari kode aktual yang saya tulis (dengan Python 2.5). Sejauh ini, ini adalah cara termudah yang saya temukan untuk melakukan apa yang Anda minta.
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))
The ctypes
hal memiliki semua jenis C-tipe data ( int
, char
, short
, void*
, dan sebagainya) dan dapat lulus dengan nilai atau referensi. Itu juga dapat mengembalikan tipe data tertentu meskipun contoh saya tidak melakukan itu (API HLL mengembalikan nilai dengan memodifikasi variabel yang dikirimkan oleh referensi).
Dalam hal contoh spesifik yang ditunjukkan di atas, EHLLAPI IBM adalah antarmuka yang cukup konsisten.
Semua panggilan melewati empat void pointer (EHLLAPI mengirimkan kembali kode melalui parameter keempat, sebuah penunjuk ke int
jadi, sementara saya tentukan int
sebagai tipe pengembalian, saya dapat dengan aman mengabaikannya) sesuai dokumentasi IBM di sini . Dengan kata lain, varian C dari fungsi tersebut adalah:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Ini membuat ctypes
fungsi tunggal yang sederhana dapat melakukan apa saja yang disediakan oleh perpustakaan EHLLAPI, tetapi kemungkinan perpustakaan lain akan membutuhkan ctypes
fungsi terpisah yang diatur per fungsi perpustakaan.
Nilai kembali dari WINFUNCTYPE
adalah prototipe fungsi tetapi Anda masih harus mengatur informasi parameter lebih banyak (lebih dan di atas jenis). Setiap tuple dalam hllApiParams
memiliki "arah" parameter (1 = input, 2 = output dan sebagainya), nama parameter dan nilai default - lihat dokumen ctypes
untuk detail
Setelah Anda memiliki prototipe dan informasi parameter, Anda dapat membuat Python "callable" hllApi
untuk memanggil fungsi tersebut. Anda cukup membuat variabel yang diperlukan ( p1
melalui p4
dalam kasus saya) dan memanggil fungsi dengan mereka.