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 ctypeshal 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 intjadi, sementara saya tentukan intsebagai 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 ctypesfungsi tunggal yang sederhana dapat melakukan apa saja yang disediakan oleh perpustakaan EHLLAPI, tetapi kemungkinan perpustakaan lain akan membutuhkan ctypesfungsi terpisah yang diatur per fungsi perpustakaan.
Nilai kembali dari WINFUNCTYPEadalah prototipe fungsi tetapi Anda masih harus mengatur informasi parameter lebih banyak (lebih dan di atas jenis). Setiap tuple dalam hllApiParamsmemiliki "arah" parameter (1 = input, 2 = output dan sebagainya), nama parameter dan nilai default - lihat dokumen ctypesuntuk detail
Setelah Anda memiliki prototipe dan informasi parameter, Anda dapat membuat Python "callable" hllApiuntuk memanggil fungsi tersebut. Anda cukup membuat variabel yang diperlukan ( p1melalui p4dalam kasus saya) dan memanggil fungsi dengan mereka.