ctypes中msvcrt的不同版本

时间:2009-08-28 18:05:30

标签: python ctypes msvcrt

在Windows中,导入ctypes模块时ctypes.cdll.msvcrt对象自动存在,它代表msvcrt Microsoft C ++运行时库according to the docs

但是,我注意到还有一个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 个答案:

答案 0 :(得分:10)

ctypes.cdll.msvcrt不仅自动存在,而且ctypes.cdll.anything自动存在,并在第一次访问时加载,加载anything.dll。因此ctypes.cdll.msvcrt加载msvcrt.dll,这是一个作为Windows一部分提供的库。它不是Python链接的C运行时,因此您不应该从msvcrt调用malloc / free。

例如,对于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。