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