Versões diferentes de msvcrt em ctypes
Pergunta
No Windows, o ctypes.cdll.msvcrt
o objeto existe automaticamente quando eu importo o módulo ctypes e representa o msvcrt
Microsoft C ++ Runtime Library De acordo com os documentos.
No entanto, noto que também há um find_msvcrt função que será "return the filename of the VC runtype library used by Python"
.
Ainda afirma, "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."
Então, minha pergunta é: qual é a diferença entre o ctypes.cdll.msvcrt
biblioteca que eu já tenho e a que posso carregar com o find_msvcrt
função? Em que circunstâncias específicas elas não podem ser a mesma biblioteca?
Solução
Não é só isso ctypes.cdll.msvcrt
existe automaticamente, mas ctypes.cdll.anything
existe automaticamente e é carregado no primeiro acesso, carregando anything.dll
. Então ctypes.cdll.msvcrt
Cargas msvcrt.dll
, que é uma biblioteca que é fornecida como parte do Windows. Não é o tempo de execução do C com o qual o Python se link, então você não deve ligar para o malloc/livre de msvcrt
.
Por exemplo, para Python 2.6/3.1, você deve usar ctypes.cdll.msvcr90
. Como isso mudará com o tempo, find_msvcrt()
fornece o nome da biblioteca que você realmente deve usar (e depois carregar ctypes.CDLL
).
Aqui estão os nomes de algumas versões diferentes do Microsoft CRT, lançadas em vários pontos como parte do MSC, VC ++, The Platform SDK ou Windows: Crtdll.dll, MSVCRT.DLL, MSVCRT4.DLL, MSVCR70.DLL, MSVCRRCR71. dll, msvcr80.dll, msvcr90.dll.