首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 程式設計入門(七):完全不依賴 CRT 的最小程式

     編輯:關於C語言

前提回顧

  • 自訂入口點可行,但若使用 CRT 函式(如 printf)卻未執行 CRT 初始化,執行期會崩潰。
  • CRT 也是微軟撰寫的程式庫,理論上可被替換或繞過。

零 CRT 依賴的 Hello World

#include <windows.h>

DWORD StringLen(const char *str) {
    const char *eos = str;
    while(*eos++);
    return (DWORD)(eos - str - 1);
}

void WriteString(const char *str) {
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD len = StringLen(str), written;
    WriteFile(hOut, str, len, &written, 0);
}

int myentry(void) {
    WriteString("Hello World!");
    ExitProcess(0);
    return 0;
}

編譯與連結指令

cl /c /Zl myentrytest.c
link /entry:myentry /subsystem:console myentrytest.obj kernel32.lib

產生 myentrytest.exe,執行輸出 Hello World!,且無任何 CRT 依賴。

關鍵技術點

  • /Zl:移除 defaultlib 指示,連結器不會自動引入 libc.lib。
  • /entry:myentry:指定真正入口點為 myentry。
  • /subsystem:console:明確指定為主控台子系統(否則連結器無法推斷報 LNK1221)。
  • kernel32.lib:顯式連結核心 DLL 匯入庫,提供 GetStdHandle、WriteFile、ExitProcess 等 Win32 API。

Win32 API 三大核心函式

API用途所屬 DLL
GetStdHandle取得標準輸入/輸出/錯誤控制代碼kernel32.dll
WriteFile向檔案/主控台寫入資料kernel32.dll
ExitProcess終止當前進程kernel32.dll

Windows API 七大功能類別

  1. 基礎服務:檔案系統、裝置、程序、執行緒、登錄、錯誤處理(kernel32.dll、advapi32.dll)
  2. 圖形裝置介面 (GDI):繪圖、列印(gdi32.dll)
  3. 使用者介面 (User):視窗、控制項、輸入(user32.dll、comctl32.dll)
  4. 通用對話方塊:開啟/儲存檔案、色彩、字型(comdlg32.dll)
  5. 通用控制項:狀態列、進度列、工具列、索引標籤(comctl32.dll)
  6. Windows Shell:殼層擴充、捷徑、資源回收筒(shell32.dll、shlwapi.dll)
  7. 網路服務:NetBIOS、Winsock、NetDDE、RPC

啟示

直接呼叫 Win32 API 可完全繞過 CRT,雖開發效率極低(需自行實作字串、記憶體、I/O 等 CRT 提供的高層抽象),但對理解作業系統底層機制、撰寫極小體積程式、逆向工程、殼碼開發極具價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved