2012-10-29 15 views
12

wczytuję dll z ctypes tak:ctypes rozładować dll

lib = cdll.LoadLibrary("someDll.dll"); 

Kiedy skończę z biblioteką, muszę rozładować go do wolnych środków, jakie stosuje. Mam problem ze znalezieniem czegokolwiek w dokumentach dotyczących tego, jak to zrobić. Widzę ten dość stary post: How can I unload a DLL using ctypes in Python?. Mam nadzieję, że jest coś oczywistego, czego nie znalazłem, a nie hack.

+1

Czy próbowałeś 'del lib'? – Junuxx

+0

Mam, ale z posta, do którego się odwołałem: "nie wiem, ale wątpię, że to zwalnia bibliotekę dll." Zgaduję, że to tylko usuwa powiązanie z nazwą w bieżącym obszarze nazw (zgodnie z odnośnikiem językowym) "Podejrzewam, że to prawda. Jestem prawie pewien, że zasoby, które muszę uwolnić, są nadal otwarte. –

Odpowiedz

19

Jedynym naprawdę skutecznym sposobem, w jaki udało mi się to zrobić, jest przejęcie połączenia LoadLibrary i FreeLibrary. W ten sposób:

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

Moje wywołania ctypes zaczynają się nie udać, kiedy idę tą trasą z tym błędem: "ValueError: Procedura prawdopodobnie wywołana ze zbyt dużą liczbą argumentów (16 bajtów w nadmiarze)" kiedy próbuję wykonać wywołanie funkcji –

+0

Jaka konwencja wywoływania jest twoją funkcją posługiwać się? 'WinDLL' oznacza' stdcall'. Czy twoja lib 'cdecl'? Jeśli tak, użyj zamiast tego 'ctypes.CDLL'. –

+0

Dziękuję za to wyjaśnienie. –

Powiązane problemy