8

在 Windows 中,ctypes.cdll.msvcrt当我导入 ctypes 模块时,该对象自动存在,它根据 docsmsvcrt表示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?在什么特定情况下它们可能不是同一个库?

4

1 回答 1

11

它不只是ctypes.cdll.msvcrt自动存在,而是ctypes.cdll.anything自动存在,并在首次访问时加载,正在加载anything.dll。因此, ctypes.cdll.msvcrtloadsmsvcrt.dll是作为 Windows 的一部分提供的库。Python 链接的不是 C 运行时,因此您不应从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。

于 2009-08-28T19:30:12.273 回答