printf)卻未執行 CRT 初始化,執行期會崩潰。#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 依賴。
defaultlib 指示,連結器不會自動引入 libc.lib。myentry。LNK1221)。GetStdHandle、WriteFile、ExitProcess 等 Win32 API。| API | 用途 | 所屬 DLL |
|---|---|---|
| GetStdHandle | 取得標準輸入/輸出/錯誤控制代碼 | kernel32.dll |
| WriteFile | 向檔案/主控台寫入資料 | kernel32.dll |
| ExitProcess | 終止當前進程 | kernel32.dll |
kernel32.dll、advapi32.dll)gdi32.dll)user32.dll、comctl32.dll)comdlg32.dll)comctl32.dll)shell32.dll、shlwapi.dll)直接呼叫 Win32 API 可完全繞過 CRT,雖開發效率極低(需自行實作字串、記憶體、I/O 等 CRT 提供的高層抽象),但對理解作業系統底層機制、撰寫極小體積程式、逆向工程、殼碼開發極具價值。