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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top