Windows系统编程(Win32 API)

Windows系统编程 API(也叫 Windows API 或 Win32 API)是 Microsoft 提供的一组 C 风格的函数接口,直接与 Windows 操作系统交互和编程,进行底层系统级功能开发。是一系列接口函数、宏、数据类型、数据结构的集合,为桌面应用程序、系统服务、驱动程序、图形界面、文件/进程/网络控制等底层功能所提供的一组 API 函数,它是构建传统 Windows 程序(.exe/.dll)的核心工具。常用功能可划分为以下几类:

分类 描述
核心系统(Kernel32.dll) 文件I/O(读写文件、目录管理)、内存(虚拟内存、堆分配)、线程和进程(多任务处理)、同步
用户界面(User32.dll) 窗口管理、消息循环、输入、对话框
图形界面(GDI32.dll) 绘图、字体、图像处理
网络(ws2_32.dll) TCP/IP、HTTP、Socket(Wininet, WinSock)
安全(Advapi32.dll) 注册表(系统配置存储)、用户权限、服务控制
Shell(Shell32.dll) 文件浏览器、任务栏、快捷方式(文件资源管理器相关)
多媒体(MMSystem.dll) 音频播放、定时器、MIDI
COM/OLE/ActiveX 面向组件开发与自动化接口
comdlg32.dll 通用对话框(文件打开、颜色选择)

1、创建窗口和消息循环(GUI)

cpp 复制代码
HWND hwnd = CreateWindowEx(
    0, L"STATIC", L"Hello WinAPI!",
    WS_OVERLAPPEDWINDOW,
    100, 100, 400, 300,
    NULL, NULL, hInstance, NULL
);

ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);

// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
cpp 复制代码
#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 注册窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = "MyWindowClass";
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindow(
        "MyWindowClass",        // 窗口类名
        "Win32 API 窗口示例",   // 窗口标题
        WS_OVERLAPPEDWINDOW,   // 窗口样式
        CW_USEDEFAULT,          // X 坐标
        CW_USEDEFAULT,          // Y 坐标
        400,                    // 宽度
        300,                    // 高度
        NULL,                   // 父窗口
        NULL,                   // 菜单句柄
        hInstance,              // 实例句柄
        NULL                    // 附加数据
    );

    ShowWindow(hwnd, nCmdShow);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
  • CreateWindow / DestroyWindow:窗口管理。

  • GetMessage / DispatchMessage:消息循环。

  • SendMessage / PostMessage:窗口间通信。

2、文件操作:

cpp 复制代码
HANDLE hFile = CreateFile(
    L"example.txt",
    GENERIC_WRITE,
    0, NULL, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL
);

DWORD written;
WriteFile(hFile, "Hello, file", 11, &written, NULL);
CloseHandle(hFile);
cpp 复制代码
#include <windows.h>

int main() {
    // 创建文件
    HANDLE hFile = CreateFile(
        "C:\\test.txt",          // 文件名
        GENERIC_WRITE,           // 访问模式(写入)
        0,                       // 共享模式(不共享)
        NULL,                    // 安全属性
        CREATE_ALWAYS,           // 创建方式(总是新建)
        FILE_ATTRIBUTE_NORMAL,   // 文件属性
        NULL                     // 模板文件句柄
    );

    if (hFile == INVALID_HANDLE_VALUE) {
        printf("CreateFile 失败: %d\n", GetLastError());
        return 1;
    }

    // 写入数据
    const char* data = "Hello, Win32 API!";
    DWORD bytesWritten;
    WriteFile(hFile, data, strlen(data), &bytesWritten, NULL);

    // 关闭文件
    CloseHandle(hFile);
    return 0;
}
  • CreateFile / ReadFile / WriteFile:文件操作。

  • GetFileAttributes / SetFileAttributes:文件属性管理。

  • FindFirstFile / FindNextFile:遍历目录。

3、进程创建:

cpp 复制代码
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;

CreateProcess(
    NULL, L"notepad.exe", NULL, NULL, FALSE,
    0, NULL, NULL, &si, &pi
);
cpp 复制代码
#include <windows.h>

int main() {
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    // 启动记事本
    BOOL success = CreateProcess(
        "C:\\Windows\\notepad.exe",  // 应用程序路径
        NULL,                        // 命令行参数
        NULL,                        // 进程安全属性
        NULL,                        // 线程安全属性
        FALSE,                       // 是否继承句柄
        0,                           // 创建标志
        NULL,                        // 环境变量
        NULL,                        // 当前目录
        &si,                         // 启动信息
        &pi                          // 进程信息
    );

    if (success) {
        WaitForSingleObject(pi.hProcess, INFINITE); // 等待进程结束
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        printf("CreateProcess 失败: %d\n", GetLastError());
    }
    return 0;
}
  • CreateProcess:启动新进程。

  • OpenProcess / TerminateProcess:控制进程。

  • GetCurrentProcessId:获取当前进程 ID。

4、多线程:

cpp 复制代码
DWORD WINAPI MyThread(LPVOID param) {
    MessageBox(NULL, L"Thread running", L"Info", MB_OK);
    return 0;
}

HANDLE hThread = CreateThread(NULL, 0, MyThread, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
cpp 复制代码
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID lpParam) {
    printf("线程运行: %d\n", GetCurrentThreadId());
    return 0;
}

int main() {
    HANDLE hThread = CreateThread(
        NULL,           // 安全属性
        0,              // 栈大小(默认)
        ThreadFunc,     // 线程函数
        NULL,           // 参数
        0,              // 创建标志
        NULL            // 线程 ID
    );

    WaitForSingleObject(hThread, INFINITE); // 等待线程结束
    CloseHandle(hThread);
    return 0;
}

5/、内存管理:

cpp 复制代码
#include <windows.h>

int main() {
    // 分配虚拟内存
    LPVOID pMem = VirtualAlloc(
        NULL,                // 由系统选择地址
        4096,                // 分配大小(4KB)
        MEM_COMMIT,          // 提交物理内存
        PAGE_READWRITE       // 可读可写
    );

    if (pMem) {
        strcpy((char*)pMem, "Hello, VirtualAlloc!");
        printf("%s\n", (char*)pMem);

        // 释放内存
        VirtualFree(pMem, 0, MEM_RELEASE);
    }
    return 0;
}
  • VirtualAlloc / VirtualFree:虚拟内存管理。

  • HeapAlloc / HeapFree:堆内存管理。

  • GlobalAlloc / LocalAlloc(旧式 API,不推荐使用)。

  • CreateThread:创建线程。

  • WaitForSingleObject / WaitForMultipleObjects:线程同步。

  • Sleep:线程休眠。

以下是常用的 Win32 API 分类及关键函数:

(1) 文件与 I/O

  • 文件操作

    • CreateFile / ReadFile / WriteFile:文件创建和读写。

    • GetFileAttributes / SetFileAttributes:文件属性管理。

  • 目录操作

    • CreateDirectory / RemoveDirectory

    • FindFirstFile / FindNextFile:遍历目录。

(2) 进程与线程

  • 进程管理

    • CreateProcess:启动新进程。

    • OpenProcess / TerminateProcess:控制进程。

  • 线程管理

    • CreateThread:创建线程。

    • WaitForSingleObject:线程同步。

  • DLL 动态链接库

    • LoadLibrary / GetProcAddress:动态加载 DLL。

(3) 内存管理

  • VirtualAlloc / VirtualFree:虚拟内存分配。

  • HeapAlloc / HeapFree:堆内存管理。

(4) 窗口与消息循环(GUI)

  • RegisterClass / CreateWindow:创建窗口。

  • GetMessage / DispatchMessage:消息循环。

  • SendMessage / PostMessage:窗口间通信。

(5) 注册表操作

  • RegOpenKey / RegQueryValue:读写注册表。

  • RegSetValue / RegDeleteKey:修改注册表。

(6) 网络编程

  • Winsock API(基于套接字):

    • socket / bind / listen / accept(类似 BSD Socket)。
  • WinINet API(HTTP/FTP):

    • InternetOpen / InternetReadFile

(7) 同步与 IPC(进程间通信)

互斥体/信号量CreateMutex / WaitForSingleObject

共享内存

管道(Pipe)

cpp 复制代码
CreatePipe(匿名管道) / CreateNamedPipe(命名管道)。

1、创建一个GUI:

cpp 复制代码
#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 注册窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = "MyWindowClass";
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindow("MyWindowClass", "Hello Windows", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

2、读写文件:

cpp 复制代码
#include <windows.h>
#include <stdio.h>

int main() {
    HANDLE hFile = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, 
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
    if (hFile == INVALID_HANDLE_VALUE) {
        printf("Error: %d\n", GetLastError());
        return 1;
    }

    const char* data = "Hello, Windows API!";
    DWORD bytesWritten;
    WriteFile(hFile, data, strlen(data), &bytesWritten, NULL);

    CloseHandle(hFile);
    return 0;
}

Win32 API 的现代替代方案

用途 Win32 API 现代替代方案
GUI 开发 user32.dll WinUI 3 / WPF
文件操作 kernel32.dll C++17 filesystem
网络通信 ws2_32.dll cURL / Boost.Asio
多线程 CreateThread C++11 <thread>
跨平台开发 仅 Windows Qt / Electron