Разные версии 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.

Другие вопросы по тегам