ctypes中的不同版本的msvcrt

8 投票
1 回答
3016 浏览
提问于 2025-04-15 13:56

在Windows系统中,当我导入ctypes模块时,ctypes.cdll.msvcrt这个对象会自动存在,它代表的是微软的C++运行时库msvcrt,具体可以参考文档

不过,我注意到还有一个find_msvcrt函数,它会"返回Python使用的VC运行时库的文件名"

文档中进一步说明,"如果你需要释放内存,比如通过调用free(void *)释放一个扩展模块分配的内存,那么重要的是要使用同一个分配内存的库中的函数。"

所以我的问题是,ctypes.cdll.msvcrt这个库和我可以通过find_msvcrt函数加载的库有什么区别?在什么情况下它们可能不是同一个库呢?

1 个回答

11

不仅仅是 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。

撰写回答