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

C 語言當然有 API:Windows API 本質是 C 函數、跨語言調用機制與聲明規範

     編輯:C 語言問答

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'` 聲明即用

開發者必備知識

  1. MSDN/Docs.microsoft.com 是權威文檔,每個 API 有語法、參數、返回值、錯誤碼、範例
  2. 頭文件/導入庫:Windows SDK 提供 `.h` (聲明) 和 `.lib` (鏈接存根)
  3. 錯誤處理:失敗返回 0/NULL/INVALID_HANDLE_VALUE,調用 `GetLastError()` 獲取錯誤碼,`FormatMessage()` 轉文本
  4. 版本檢查:`GetVersionEx()` / `VerifyVersionInfo()` 確認 API 可用性
  5. 64 位兼容:指針類型用 `HANDLE` `LPVOID` `UINT_PTR`,避免截斷

常用 API 分類速查

類別代表 DLL典型 API
內核/進程/線程/內存kernel32.dll`CreateProcess` `VirtualAlloc` `CreateThread` `WaitForSingleObject`
窗口/消息/GUIuser32.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`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved