Versioni diverse di MSVCRT in ctypes
Domanda
In Windows, l'oggetto ctypes.cdll.msvcrt
esiste automaticamente quando ho importare il modulo ctypes, e rappresenta il msvcrt
Microsoft C ++ libreria di runtime secondo la documentazione .
Tuttavia, ho notato che c'è anche un find_msvcrt funzione che "return the filename of the VC runtype library used by Python"
.
La comunicazione precisa inoltre, "If you need to free memory, for example, allocated by an extension module with a call to the free(void *), it is important that you use the function in the same library that allocated the memory."
Quindi la mia domanda è, qual è la differenza tra la biblioteca ctypes.cdll.msvcrt
che ho già e quello che posso caricare con la funzione find_msvcrt
? In quali circostanze specifiche potrebbero non essere la stessa libreria?
Soluzione
Non è solo che ctypes.cdll.msvcrt
esiste automaticamente, ma ctypes.cdll.anything
esiste automaticamente, e viene caricato il primo accesso, carico anything.dll
. Così carichi ctypes.cdll.msvcrt
msvcrt.dll
, che è una libreria che viene fornito come parte di Windows. Non è il runtime C che i collegamenti Python con, quindi non si dovrebbe chiamare il malloc / libero da msvcrt
.
Ad esempio, per Python 2.6 / 3.1, si dovrebbe utilizzare ctypes.cdll.msvcr90
. Dato che questo cambierà nel corso del tempo, find_msvcrt()
si dà il nome della libreria che si dovrebbe davvero usare (e quindi caricare attraverso ctypes.CDLL
).
Ecco i nomi di alcune versioni diverse di Microsoft CRT, uscito in vari punti come parte di MSC, VC ++, la piattaforma SDK, o Windows: CRTDLL.DLL, Msvcrt.dll, msvcrt4.dll, Msvcr70.dll , msvcr71.dll, msvcr80.dll, msvcr90.dll.