2012-10-29 30 views
12

boşaltmak. Dokümanlarda bunun nasıl yapılacağına dair bir şey bulmakta zorlanıyorum. Bu eski yazıyı görüyorum: How can I unload a DLL using ctypes in Python?. Umduğum yerde olmayan bir şey olduğunu ve daha az bir kesmek olduğunu umuyorum.ctypes Böyle ctypes ile dll yüklenirken am dll

+1

Del lib' denediniz mi? – Junuxx

+0

Ben, ama başvurulan gönderiden: "Bilmiyorum, ama bu dll kaldırır şüpheliyim. Sadece geçerli ad alanında (örneğin, dil referansı) adından bağlamayı kaldırır sanırım "Bunun doğru olduğundan şüpheleniyorum. Serbest bırakılmam gereken kaynağın hala açık olduğuna eminim. –

cevap

19

Bunu yapmak için bulduğum tek gerçekten etkili yol, LoadLibrary ve FreeLibrary numaralarını almaktır. Bunun gibi:

import ctypes 

# get the module handle and create a ctypes library object 
libHandle = ctypes.windll.kernel32.LoadLibraryA('mydll.dll') 
lib = ctypes.WinDLL(None, handle=libHandle) 

# do stuff with lib in the usual way 
lib.Foo(42, 666) 

# clean up by removing reference to the ctypes library object 
del lib 

# unload the DLL 
ctypes.windll.kernel32.FreeLibrary(libHandle) 
+0

Bu hata ile bu rotadan aşağıya indiğimde klişe çağrılarım başarısız oluyor: "ValueError: Prosedür muhtemelen çok fazla argümanla çağrıldı (fazladan 16 bayt)" bir işlev çağrısı yapmaya çalıştığımda –

+0

işlevini çağırmak kullanılır? 'WinDLL'' stdcall' anlamına gelir. Lib 'cdecl'in mi? Öyleyse bunun yerine 'ctypes.CDLL' kullanın. –

+0

Bu açıklama için teşekkür ederim. –