Различные версии msvcrt в ctypes
Вопрос
В Windows, the ctypes.cdll.msvcrt
объект автоматически существует, когда я импортирую модуль ctypes, и он представляет msvcrt
Библиотека среды выполнения Microsoft C++ согласно документам.
Однако я замечаю, что существует также find_msvcrt найти функция, которая будет "return the filename of the VC runtype library used by Python"
.
Далее в нем говорится, "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."
Итак, мой вопрос в том, в чем разница между ctypes.cdll.msvcrt
библиотека, которая у меня уже есть, и та, которую я могу загрузить с помощью find_msvcrt
функция?При каких конкретных обстоятельствах они могут не быть одной и той же библиотекой?
Решение
Дело не только в этом ctypes.cdll.msvcrt
автоматически существует, но ctypes.cdll.anything
автоматически существует и загружается при первом доступе, загрузка anything.dll
.Итак ctypes.cdll.msvcrt
нагрузки msvcrt.dll
, которая представляет собой библиотеку, которая поставляется как часть Windows.Python ссылается не на среду выполнения C, поэтому вам не следует вызывать malloc / free из msvcrt
.
Например, для Python 2.6 /3.1 вы должны использовать ctypes.cdll.msvcr90
.Поскольку это будет меняться со временем, find_msvcrt()
дает вам имя библиотеки, которую вы действительно должны использовать (а затем загрузить через ctypes.CDLL
).
Вот названия нескольких различных версий Microsoft CRT, выпущенных в разные моменты как часть MSC, VC ++, platform SDK или Windows:crtdll.dll , msvcrt.dll, msvcrt4.dll, msvcr70.dll, msvcr71.dll, msvcr80.dll, msvcr90.dll,,,,.