2012-10-29 5 views
12

sto caricamento di una DLL con ctypes come questo:ctypes scaricano dll

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

Quando mi sono fatto con la libreria, ho bisogno di scaricarlo per liberare risorse che utilizza. Sto riscontrando problemi nel trovare qualcosa nei documenti su come farlo. Vedo questo post piuttosto vecchio: How can I unload a DLL using ctypes in Python?. Spero che ci sia qualcosa di ovvio che non ho trovato e meno di un trucco.

+1

Hai provato 'del lib'? – Junuxx

+0

Ho, ma, dal post ho fatto riferimento: "Non lo so, ma dubito che questo scarica la DLL. Immagino che rimuova solo l'associazione dal nome nello spazio dei nomi corrente (come per riferimento alla lingua) "Sospetto che sia vero. Sono abbastanza sicuro che la risorsa che ho bisogno di essere liberata sia ancora aperta. –

risposta

19

L'unico modo veramente efficace che abbia mai trovato per fare questo è quello di prendere in carico di chiamare LoadLibrary e FreeLibrary. Così:

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

Le chiamate di tipo ctypes iniziano a fallire quando percorro questa rotta con questo errore: "ValueError: procedura chiamata probabilmente con troppi argomenti (16 byte in eccesso)" quando tento di effettuare una chiamata chiamata –

+0

Quale convenzione di chiamata è la funzione che intendete per uso? 'WinDLL' significa' stdcall'. La tua lib 'cdecl'? Se è così usa invece 'ctypes.CDLL'. –

+0

Grazie per questa spiegazione. –

Problemi correlati