跳转至

Windows API

概述

Windows API(Win32 API)是Windows操作系统提供的应用程序编程接口,用于开发Windows应用程序。本文档重点介绍系统编程中常用的API,特别是内存管理、进程与线程管理、文件操作等核心功能。

Windows API分类

  • 基础服务API:文件系统、设备管理、进程线程、内存管理
  • 图形设备接口(GDI):图形绘制、设备上下文
  • 用户界面API:窗口管理、消息处理、控件
  • 网络API:Winsock、WinINet
  • 安全API:认证、加密、访问控制

API分类

graph TB
    A[Windows API] --> B[内存管理]
    A --> C[进程与线程]
    A --> D[文件操作]
    A --> E[同步对象]
    A --> F[动态链接库]
    A --> G[网络编程]
    
    B --> B1[堆内存]
    B --> B2[虚拟内存]
    B --> B3[内存映射]
    
    C --> C1[进程创建]
    C --> C2[线程管理]
    C --> C3[进程间通信]
    
    D --> D1[文件读写]
    D --> D2[目录管理]
    D --> D3[文件属性]
    
    E --> E1[临界区]
    E --> E2[互斥量]
    E --> E3[信号量]
    E --> E4[事件]
    
    style A fill:#E3F2FD
    style B fill:#E8F5E9
    style C fill:#FFF3E0
    style D fill:#F3E5F5
    style E fill:#FCE4EC

主要内容

内存管理API

内存管理API
  • GlobalAlloc/LocalAlloc: 全局/局部内存分配
  • HeapCreate/HeapAlloc: 堆内存管理
  • VirtualAlloc/VirtualFree: 虚拟内存管理
  • CreateFileMapping: 内存映射文件
  • HeapWalk: 堆遍历

进程与线程API

进程与线程API
  • CreateProcess: 创建新进程
  • CreateThread: 创建线程
  • OpenProcess/OpenThread: 打开现有进程/线程
  • TerminateProcess/TerminateThread: 终止进程/线程
  • WaitForSingleObject: 等待对象

文件操作API

文件操作API
  • CreateFile: 创建或打开文件
  • ReadFile/WriteFile: 文件读写
  • SetFilePointer: 设置文件指针
  • GetFileSize: 获取文件大小
  • CreateDirectory: 创建目录

同步对象API

同步对象API
  • CreateMutex: 创建互斥量
  • CreateSemaphore: 创建信号量
  • CreateEvent: 创建事件对象
  • InitializeCriticalSection: 初始化临界区
  • EnterCriticalSection: 进入临界区

目录

内存管理

进程与线程

文件操作

同步对象

动态链接库

常用头文件

头文件 说明
windows.h Windows核心API(包含大部分API)
winbase.h 基本服务API(进程、内存、文件等)
windef.h 基本类型定义
winnt.h NT内核相关定义
winuser.h 用户界面API
wingdi.h 图形设备接口API
winsock2.h Winsock网络API

数据类型

基本类型

类型 说明 对应C类型
BOOL 布尔值 int
BYTE 字节 unsigned char
WORD unsigned short
DWORD 双字 unsigned long
UINT 无符号整数 unsigned int
LONG 长整数 long
LONGLONG 64位整数 __int64
FLOAT 浮点数 float
DOUBLE 双精度浮点 double

指针类型

类型 说明
LPVOID 无类型指针(void*)
LPSTR 字符串指针(char*)
LPCSTR 常量字符串指针(const char*)
LPWSTR 宽字符串指针(wchar_t*)
LPCWSTR 常量宽字符串指针
HANDLE 对象句柄
HWND 窗口句柄

句柄类型

类型 说明
HANDLE 通用对象句柄
HWND 窗口句柄
HINSTANCE 实例句柄
HMODULE 模块句柄
HFILE 文件句柄
HPROCESS 进程句柄
HTHREAD 线程句柄
HEAP 堆句柄

错误处理

GetLastError

C++
DWORD GetLastError();  // 获取最后一个错误代码

FormatMessage

C++
1
2
3
4
5
6
7
8
9
DWORD FormatMessage(
    DWORD   dwFlags,      // 格式化选项
    LPCVOID lpSource,     // 消息定义源
    DWORD   dwMessageId,  // 消息标识符
    DWORD   dwLanguageId, // 语言标识符
    LPTSTR  lpBuffer,     // 输出缓冲区
    DWORD   nSize,        // 缓冲区大小
    va_list *Arguments    // 插入参数
);

示例

C++
// 获取并显示错误信息
LPVOID lpMsgBuf;
DWORD dw = GetLastError(); 

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    dw,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL );

printf("Error %d: %s\n", dw, (LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);

常见错误码

错误码 说明
ERROR_SUCCESS 0 操作成功
ERROR_INVALID_FUNCTION 1 函数不正确
ERROR_FILE_NOT_FOUND 2 系统找不到指定的文件
ERROR_PATH_NOT_FOUND 3 系统找不到指定的路径
ERROR_ACCESS_DENIED 5 拒绝访问
ERROR_INVALID_HANDLE 6 句柄无效
ERROR_NOT_ENOUGH_MEMORY 8 存储空间不足
ERROR_SHARING_VIOLATION 32 共享冲突
ERROR_ALREADY_EXISTS 183 文件已存在

实用宏

句柄验证

C++
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)  // 无效句柄值
#define NULL ((void *)0)                             // 空指针

MAKEWORD/MAKELONG

C++
1
2
3
4
WORD MAKEWORD(BYTE low, BYTE high);
DWORD MAKELONG(WORD low, WORD high);
DWORD MAKELPARAM(WORD low, WORD high);
DWORD MAKELRESULT(WORD low, WORD high);

LOWORD/HIWORD

C++
1
2
3
4
WORD LOWORD(DWORD dwValue);   // 取低字
WORD HIWORD(DWORD dwValue);   // 取高字
BYTE LOBYTE(WORD wValue);     // 取低字节
BYTE HIBYTE(WORD wValue);     // 取高字节

字符集处理

Unicode与ANSI

Windows API函数通常有两个版本: - FunctionNameA:ANSI版本 - FunctionNameW:宽字符(Unicode)版本

示例

C++
// ANSI版本
BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);

// Unicode版本
BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);

// 根据UNICODE宏自动选择
#ifdef UNICODE
#define CreateDirectory CreateDirectoryW
#else
#define CreateDirectory CreateDirectoryA
#endif

TCHAR类型

C++
1
2
3
4
5
6
7
8
9
#ifdef UNICODE
typedef wchar_t TCHAR;
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef char TCHAR;
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif

使用示例

C++
TCHAR szBuffer[256];
_tcscpy_s(szBuffer, _T("Hello World"));  // 自动适配字符集

参考资料