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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top