2009-08-28 26 views
7

En Windows, el objeto ctypes.cdll.msvcrt existe automáticamente cuando importo el módulo ctypes, y representa msvcrt la biblioteca de tiempo de ejecución de Microsoft C++ according to the docs.Diferentes versiones de msvcrt en ctypes

Sin embargo, veo que también hay una función find_msvcrt que será "return the filename of the VC runtype library used by Python".

Además, se señala, "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? ¿Bajo qué circunstancias específicas podrían no ser la misma biblioteca?

+1

relacionado: [¿cuáles son las diferencias entre las formas de acceder a msvcrt en python en Windows?] (Https://stackoverflow.com/q/30790494/4279) – jfs

Respuesta

10

No se trata sólo de que existe ctypes.cdll.msvcrt automáticamente, pero existe ctypes.cdll.anything automáticamente y se carga en el primer acceso, cargando anything.dll. Así que ctypes.cdll.msvcrt carga msvcrt.dll, que es una biblioteca que se envía como parte de Windows. No es el tiempo de ejecución de C con el que se vincula Python, por lo que no debe llamar al malloc/free desde msvcrt.

Por ejemplo, para Python 2.6/3.1, debe utilizar ctypes.cdll.msvcr90. Como esto cambiará con el tiempo, find_msvcrt() le da el nombre de la biblioteca que realmente debe usar (y luego carga a través de ctypes.CDLL).

Estos son los nombres de algunas versiones diferentes de Microsoft CRT, publicadas en varios puntos como parte de MSC, VC++, la plataforma SDK o Windows: crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70. dll, msvcr71.dll, msvcr80.dll, msvcr90.dll.

+0

¡Gracias! No pasé mucho tiempo programando en Windows-land, por lo que este tipo de detalles es extremadamente útil. –

+4

, por lo que para completar, ctypes.cdll [ctypes.util.find_msvcrt()] debe devolver un identificador al CRT adecuado. –

Cuestiones relacionadas