Kullanım kolaylığı için, ctypes gidilecek yoldur.
Aşağıdaki ctypes örneği yazdığım gerçek koddan (Python 2.5). Bu, sorduğunuz şeyi yapmak için bulduğum en kolay yol oldu.
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))
ctypes
Malzeme (her Cı-tip veri türleri vardır int
, char
, short
, void*
, ve benzeri) ve değer ya da referans ile bu geçebilir. Örneğim bunu yapmasa da belirli veri türlerini döndürebilir (HLL API, başvuru ile iletilen bir değişkeni değiştirerek değerleri döndürür).
Yukarıda gösterilen spesifik örnek açısından, IBM'in EHLLAPI'si oldukça tutarlı bir arayüzdür.
Tüm çağrılar dört boş işaretçi (EHLLAPI dönüş kodunu dördüncü parametre aracılığıyla geri gönderir, bu şekilde bir işaretçi , dönüş türü olarak int
belirtirken int
, güvenli bir şekilde yok sayabilirim) burada IBM'in belgelerine göre . Başka bir deyişle, işlevin C varyantı şu şekildedir:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Bu ctypes
, EHLLAPI kitaplığının sağladığı her şeyi yapabilen tek ve basit bir işlev sağlar, ancak diğer kitaplıkların ctypes
kitaplık işlevi başına ayrı bir işleve ihtiyaç duyması muhtemeldir .
Dönüş değeri WINFUNCTYPE
bir işlev prototipidir, ancak yine de daha fazla parametre bilgisi ayarlamanız gerekir (türlerin üstünde ve üstünde). Her bir demet hllApiParams
"yön" (1 = giriş, 2 = çıkış vb.), Parametre adı ve varsayılan değere sahiptir - ayrıntılar için ctypes
doco'ya bakın
Prototip ve parametre bilgilerine sahip olduktan sonra hllApi
, işlevi çağırmak için "çağrılabilir" bir Python oluşturabilirsiniz . Sadece (gerekli değişken oluşturmak p1
yoluyla p4
benim durumumda) ve onlarla birlikte işlevini çağırın.