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 | 通用对话框(文件打开、颜色选择) |
下面是一些常用API举例。
1、创建窗口和消息循环(GUI):
#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;
}
2、文件操作:
#include <windows.h>
#include <stdio.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 / CreateDirectory / RemoveDirectory :遍历目录
3、进程创建:
#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;
}
同步与 IPC(进程间通信)
互斥体/信号量:CreateMutex
/ WaitForSingleObject
。
管道(Pipe):
CreatePipe(匿名管道) / CreateNamedPipe(命名管道)。
4、多线程:
#include <windows.h>DWORD WINAPI ThreadFunc(LPVOID lpParam) {printf("线程运行: %d\n", GetCurrentThreadId());return 0;
}DWORD WINAPI MyThread(LPVOID param) {MessageBox(NULL, L"Thread running", L"Info", MB_OK);return 0;
}int main() {HANDLE hThread = CreateThread(NULL, // 安全属性0, // 栈大小(默认)ThreadFunc, // 线程函数NULL, // 参数0, // 创建标志NULL // 线程 ID);WaitForSingleObject(hThread, INFINITE); // 等待线程结束CloseHandle(hThread);return 0;
}
5、内存管理:
#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;
}
6、注册表操作
-
RegOpenKey
/RegQueryValue
:读写注册表。 -
RegSetValue
/RegDeleteKey
:修改注册表。
7、网络编程
-
Winsock API(基于套接字):
-
socket
/bind
/listen
/accept
(类似 BSD Socket)。
-
-
WinINet API(HTTP/FTP):
-
InternetOpen
/InternetReadFile
。
-
Win32 API 的现代替代方案
用途 | Win32 API | 现代替代方案 |
---|---|---|
GUI 开发 |
| WinUI 3 / WPF |
文件操作 |
| C++17 |
网络通信 |
| cURL / Boost.Asio |
多线程 |
| C++11 |
跨平台开发 | 仅 Windows | Qt / Electron |