2012-01-13 46 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

相關問題