Разные версии msvcrt в ctypes - PullRequest
7 голосов
/ 28 августа 2009

В 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 Ответ

10 голосов
/ 28 августа 2009

Это не только то, что 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.

...