2009-08-28 11 views
7

In Windows existiert das ctypes.cdll.msvcrt Objekt automatisch, wenn ich das Ctypes-Modul importiere, und es stellt die msvcrt Microsoft C++ - Laufzeitbibliothek according to the docs dar.Verschiedene Versionen von msvcrt in ctypes

Allerdings merke ich, dass es auch eine find_msvcrt Funktion gibt, die "return the filename of the VC runtype library used by Python" wird.

Weiter heißt es, "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."

So ist meine Frage, was ist der Unterschied zwischen der ctypes.cdll.msvcrt Bibliothek, die ich schon habe und die, die ich mit der find_msvcrt Funktion laden kann? Unter welchen Umständen könnten sie nicht dieselbe Bibliothek sein?

+1

verwandt: [Was sind die Unterschiede zwischen den Möglichkeiten zum Zugriff auf msvcrt in Python auf Windows?] (Https://Stackoverflow.com/q/30790494/4279) – jfs

Antwort

10

Es ist nicht nur, dass ctypes.cdll.msvcrt automatisch existiert, aber ctypes.cdll.anything automatisch existiert, und wird beim ersten Zugriff geladen, Laden anything.dll. So lädt ctypes.cdll.msvcrtmsvcrt.dll, die eine Bibliothek ist, die als Teil von Windows ausgeliefert wird. Es ist nicht die C-Laufzeit, mit der Python verlinkt, also sollten Sie malloc/free nicht von msvcrt anrufen.

Zum Beispiel sollten Sie für Python 2.6/3.1 ctypes.cdll.msvcr90 verwenden. Da sich dies mit der Zeit ändert, geben Sie find_msvcrt() den Namen der Bibliothek an, die Sie wirklich verwenden sollten (und laden Sie dann über ctypes.CDLL).

Hier sind die Namen einiger verschiedener Versionen des Microsoft CRT, die an verschiedenen Stellen als Teil von MSC, VC++, dem Plattform-SDK oder Windows veröffentlicht wurden: crtdll.dll, msvcrt.dll, msvcrt4.dll, msvcr70. dll, msvcr71.dll, msvcr80.dll, msvcr90.dll.

+0

Vielen Dank! Ich habe nicht viel Zeit in Windows-Land programmiert, daher ist diese Art von Details sehr hilfreich. –

+4

so für die Vollständigkeit - ctypes.cdll [ctypes.util.find_msvcrt()] sollte ein Handle auf die richtige CRT zurückgeben. –

Verwandte Themen