Las diferentes versiones de msvcrt en ctypes
Pregunta
En Windows, el objeto ctypes.cdll.msvcrt
existe automáticamente al importar el módulo ctypes, y representa la msvcrt
Microsoft C ++ biblioteca de tiempo de ejecución según los docs .
Sin embargo, noto que hay también una find_msvcrt función que se "return the filename of the VC runtype library used by Python"
.
Además se estados, "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."
Así que mi pregunta es, ¿cuál es la diferencia entre la biblioteca ctypes.cdll.msvcrt
que ya tengo y la que puedo cargar con la función find_msvcrt
? ¿En qué circunstancias específicas podrían no ser la misma biblioteca?
Solución
No se trata sólo de que existe ctypes.cdll.msvcrt
automáticamente, pero existe de forma automática ctypes.cdll.anything
, y se carga en el primer acceso, carga anything.dll
. Así cargas ctypes.cdll.msvcrt
msvcrt.dll
, que es una biblioteca que se incluye como parte de Windows. No es el tiempo de ejecución de C que los enlaces Python con, por lo que no debe llamar a la malloc / libre de msvcrt
.
Por ejemplo, para Python 2.6 / 3.1, usted debe utilizar ctypes.cdll.msvcr90
. A medida que esto va a cambiar con el tiempo, find_msvcrt()
le da el nombre de la biblioteca que realmente debería usar (y luego cargar a través ctypes.CDLL
).
Estos son los nombres de las diferentes versiones del Microsoft CRT, dado a conocer en varios puntos como parte de MSC, VC ++, el SDK de la plataforma, o Windows: crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70.dll , msvcr71.dll, msvcr80.dll, msvcr90.dll.