2012-10-29 17 views
12

उतारना मैं इस तरह ctypes के साथ एक dll लोड कर रहा हूँ:ctypes dll

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

जब मैं पुस्तकालय के साथ किया हूँ, मैं मुक्त संसाधनों का उपयोग करता है करने के लिए इसे अनलोड करने के लिए की जरूरत है। मुझे यह कैसे करना है इसके बारे में दस्तावेज़ों में कुछ भी खोजने में समस्याएं आ रही हैं। मैं इसे पुरानी पोस्ट देखता हूं: How can I unload a DLL using ctypes in Python?। मुझे आशा है कि कुछ ऐसा स्पष्ट है जो मुझे नहीं मिला है और एक हैक से कम है।

+1

क्या आपने 'del lib' की कोशिश की है? – Junuxx

+0

मेरे पास पोस्ट किया गया है, लेकिन, मैंने संदर्भित किया है: "मुझे नहीं पता, लेकिन मुझे संदेह है कि यह डीएलएल को उतार देता है। मुझे लगता है कि यह केवल वर्तमान नामस्थान में नाम से बाइंडिंग को हटा देगा (भाषा संदर्भ के अनुसार) "मुझे संदेह है कि यह सच है। मुझे पूरा यकीन है कि जिस संसाधन को मुझे मुक्त करने की आवश्यकता है वह अभी भी खुली है। –

उत्तर

19

मुझे ऐसा करने का एकमात्र सही तरीका यह है कि LoadLibrary और FreeLibrary पर कॉल करने का प्रभार लेना है। इस तरह:

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

जब मैं इस त्रुटि के साथ इस मार्ग से नीचे जाता हूं तो मेरी सीटीपीएस कॉल विफल होने लगती है: "ValueError: जब मैं फ़ंक्शन कॉल करने का प्रयास करता हूं तो प्रक्रिया शायद अधिक तर्क (16 बाइट्स अतिरिक्त) के साथ बुलाया जाता है" –

+0

आपका फ़ंक्शन क्या कॉलिंग सम्मेलन है उपयोग? 'विनडएलएल' का अर्थ है 'stdcall'। क्या आपका lib 'cdecl' है? यदि ऐसा है तो इसके बजाय 'ctypes.CDLL' का उपयोग करें। –

+0

उस स्पष्टीकरण के लिए धन्यवाद। –