C 語言當然有 API:Windows API 本質是 C 函數、跨語言調用機制與聲明規範
「C 語言沒有 API」是極大誤解。Windows API (Win32 API) 完全由 C 語言編寫,本質是導出自 DLL 的 C 函數,任何支援 C 調用約定的語言均可直接調用。
API 本質解析
| 層面 | 說明 |
| 定義 | Application Programming Interface:預先實現的功能接口 |
| Windows API 形式 | 動態鏈接庫 (DLL) 導出函數:`kernel32.dll`、`user32.dll`、`gdi32.dll` 等 |
| 調用約定 | `__stdcall` (WINAPI) —— 參數右至左入棧、被調用者清棧 |
| 命名規範 | PascalCase:`CreateFileW`、`GetWindowTextA`、`RegOpenKeyEx` |
| 字符集版本 | 以 `A` (ANSI) / `W` (Unicode) 結尾,宏 `UNICODE` 控制默認 |
C 語言調用 Windows API 範例
#include <windows.h>
#include <stdio.h>
int main() {
// 獲取系統目錄
wchar_t sysDir[MAX_PATH];
UINT len = GetSystemDirectoryW(sysDir, MAX_PATH);
if (len) {
wprintf(L"系統目錄: %s\n", sysDir);
}
// 彈出消息框 (User32.dll)
MessageBoxW(NULL, L"Hello, Windows API!", L"C 語言調用 API", MB_OK | MB_ICONINFORMATION);
return 0;
}
跨語言調用機制
- C/C++:直接 `#include `,鏈接 `kernel32.lib` `user32.lib`
- C#:P/Invoke (`[DllImport("user32.dll")]`) 映射非托管函數
- Python:`ctypes.windll.user32.MessageBoxW` 或 `pywin32` 封裝
- Go:`syscall.LoadLibrary` + `syscall.GetProcAddress` 或 `golang.org/x/sys/windows`
- Rust:`windows-rs` crate 提供類型安全綁定
- Delphi/Lazarus:`external 'user32.dll' name 'MessageBoxW'` 聲明即用
開發者必備知識
- MSDN/Docs.microsoft.com 是權威文檔,每個 API 有語法、參數、返回值、錯誤碼、範例
- 頭文件/導入庫:Windows SDK 提供 `.h` (聲明) 和 `.lib` (鏈接存根)
- 錯誤處理:失敗返回 0/NULL/INVALID_HANDLE_VALUE,調用 `GetLastError()` 獲取錯誤碼,`FormatMessage()` 轉文本
- 版本檢查:`GetVersionEx()` / `VerifyVersionInfo()` 確認 API 可用性
- 64 位兼容:指針類型用 `HANDLE` `LPVOID` `UINT_PTR`,避免截斷
常用 API 分類速查
| 類別 | 代表 DLL | 典型 API |
| 內核/進程/線程/內存 | kernel32.dll | `CreateProcess` `VirtualAlloc` `CreateThread` `WaitForSingleObject` |
| 窗口/消息/GUI | user32.dll | `CreateWindowEx` `SendMessage` `GetMessage` `SetWindowLongPtr` |
| 圖形繪製 | gdi32.dll | `CreatePen` `TextOut` `BitBlt` `StretchDIBits` |
| 註冊表 | advapi32.dll | `RegOpenKeyEx` `RegQueryValueEx` `RegSetValueEx` |
| 文件系統 | kernel32.dll | `CreateFile` `ReadFile` `WriteFile` `FindFirstFile` |
| 網絡通信 | ws2_32.dll | `socket` `connect` `send` `recv` `WSAAsyncSelect` |