2012-01-13 47 views
5

我一直在想知道哪个实现哪个。我的猜测是,例如fopen正在使用OpenFile实施。据我所知,Win32 API比MSVC C库实现更完整,所以我的猜测会有道理。什么是Windows上的较低级别:C库或相应的Win32 API函数?

这是正确的,还是相反?

+4

Windows没有“C库”。每个编译器都有它自己的。所有的C库都可以使用Windows API(它是Windows的一部分),Windows API使用Windows内核。你也可以直接使用Windows内核,但它没有记录和不稳定(它的API,也就是不是内核本身)。 – 2012-01-13 14:40:37

+4

很明显,C标准库是在Win32 API之上实现的,而不是其他方式。您可以从至少有六种不同的C std库实现(其中一些是开放源代码并调用Win32函数)中扣除此项。 – Damon 2012-01-13 14:41:01

+0

* Windows内核的部件*没有记录,并且由于某种原因它们没有记录 - 您不打算使用它们,因为它们可能会随时更改! Windows Kernel的其他部分,通常是'kernel32.dll'的输出函数,都有很好的文档记录,可以用于一般用途。 Damon的观点恰恰是正确的 - 你可以使用Windows函数编写自己的C运行时库,就像Microsoft一样。 Windows API *具有*为较低级别,因为Windows是操作系统。在其他环境中也是如此:CRT调用OS或更低级别的系统中断。 – 2012-01-14 10:05:28

回答

5

是的,Win32是比标准C库更“低级”的API ......基本上,Windows上的标准C库是本地Windows系统调用的抽象,允许某些标准操作在任何系列中保持兼容支持C标准库的平台。每个平台都会根据内部原生系统调用自行实现C库。

1

好了,最终两个都将用一个内核函数来实现,它调用驱动程序,这反过来又让所有的魔法获得文件句柄。如果fopen调用OpenFile,或者如果OpenFile调用fopen或者这两个调用都没有,那么你不需要查看源代码就可以看出其他东西(而不同的实现可能会以不同的方式实现它)。

+2

OpenFile是一个没有人使用的老功能,我确定所有的CRT实现都使用CreateFile – Anders 2012-01-13 20:44:11

+0

更具体地说,'OpenFile'是一个16位的Windows函数; 'CreateFile'已经被重载,比在32位Windows中创建文件做更多的事情。但是'CreateFile' *很可能是内核函数(并不是说它没有低级的,未公开的辅助函数)。这是'kernel32.dll'的一个文档导出。 – 2012-01-14 10:07:38

相关问题