Windows API 学习笔记(1) 类型和进程
学习目标 : 主要在于学习怎么用C/C++使用Windows操作系统, 不学界面, 只学底层, 比如内存管理, 线程, 系统信息调用, 网络编程相关.
类型和进程
Windows类型
Windows类型 | 等效C/C++类型 | 大小 | 用途 |
---|---|---|---|
BYTE |
unsigned char |
1字节 | 二进制数据、字节流 |
WORD |
unsigned short |
2字节 | 16位无符号整数(如端口号) |
DWORD |
unsigned long |
4字节 | 32位无符号整数(如进程ID、错误码) |
DWORD64 |
unsigned long long |
8字节 | 64位无符号整数 |
INT , UINT |
int , unsigned int |
4字节 | 通用有/无符号整数 |
LONG , ULONG |
long , unsigned long |
4字节 | 长整数(Win32 API常用) |
BOOL |
int |
4字节 | 布尔值(TRUE /FALSE ) |
HANDLE |
void* |
4/8字节 | 内核对象通用句柄(文件、进程等) |
CHAR /LPSTR |
char* |
1字节 | ANSI字符串(多字节编码) |
WCHAR /LPWSTR |
wchar_t* |
2字节 | Unicode字符串(UTF-16) |
LPVOID |
void* |
4/8字节 | void* (通用指针) |
wchar
现代Windows系统的原生字符编码方式就是Unicode(UTF-16), 就是wchar本身的编码方式(两字节宽字符), 因此Windows系统最好使用wchar字符串, 可以减少很多转码的开销.
C++本身也支持宽字符 :
wchar_t
: 宽字符类型.<cwchar>
: 宽字符库, 有wprintf
,wcslen
等实现对宽字符串的处理.<locale>
: 设置本地化, 因为默认按照ASCII编码解释, 通过setlocale可以改变解释规则.1
2#include <locale>
setlocale(LC_ALL, ""); // 启用本地化支持(如控制台输出中文)这里选择
LC_ALL
代表依据操作系统本身的本地化规则来解释, 比如汉字在不设置之前就无法被读出.std::wstring
:1
std::wstring ws = L"你好,世界!";
进程相关
CreateProcessW
用绝对路径或相对路径指定一个可执行文件, 开辟一个进程运行该可执行文件.
CreateProcessW总共有10个参数, 但现在只需要先知道第二个参数传入可执行文件路径.
下面的例子中, 我们开辟了一个进程运行了Windows自带的记事本 :
1 |
|
- 注意第二个参数必须要传入可修改的宽字符串缓冲区, 我们需要在栈上开辟然后传入, 不可以直接在第二个参数处传入路径, 因为普通字符串会被视为常量只读, 不可修改, 而CreateProcessW会在内部对第二个参数进行修改, 因此必须栈上构造再传入.
- 倒数第二个参数可以设置一些启动线程的设置.
- 最后一个参数用来存放启动的进程对应的进程/线程句柄, 这个两种句柄的作用很大, 可以查询各种进程/线程的信息. 需要这两个句柄最后必须通过
CloseHandle
函数消掉, 不然会内存泄露.
OpenProcess
传入进程PID, 返回对应进程的线程句柄.
1 |
|
TerminateProcess
传入句柄, 强制终止对应进程.
1 |
|
下面一个例子, 我们将再外部打开记事本, 通过任务管理器找到对应的PID, 传入程序, 通过OpenProcess
获取进程句柄, 再通过TerminateProcess
强制停止记事本进程 :
1 |
|
我们会发现, 我们外部开启的记事本会被我们启动的程序强制关闭.
进程句柄的作用
终止进程 : 效果同上, 可以强关卡死的进程, 关闭冲突进程.
等待进程结束, 实现进程同步.
1
WaitForSingleObject(hProcess, INFINITE); // 阻塞直到进程退出
查询进程信息 :
GetProcessTimes : 输出时间相关的数据, 传入进程句柄和四种时间参数.
参数 类型 单位 说明 lpCreationTime
FILETIME
100纳秒 进程创建时间(UTC时间戳) lpExitTime
FILETIME
100纳秒 进程退出时间(若未退出则为0) lpKernelTime
FILETIME
100纳秒 进程在内核模式消耗的CPU时间(所有线程累计) lpUserTime
FILETIME
100纳秒 进程在用户模式消耗的CPU时间(所有线程累计) GetProcessMemoryInfo : 输入内存相关的数据, 传入进程句柄和
PROCESS_MEMORY_COUNTERS
, 以下是pmc的参数 :字段 类型 单位 说明 WorkingSetSize
SIZE_T
字节 当前物理内存占用(工作集) PeakWorkingSetSize
SIZE_T
字节 物理内存占用的历史峰值 PagefileUsage
SIZE_T
字节 虚拟内存使用量(含磁盘分页文件) PeakPagefileUsage
SIZE_T
字节 虚拟内存占用的历史峰值 PageFaultCount
DWORD
次 页错误次数(硬错误+软错误)
进程状态检测器
利用Windows API的进程函数, 展示所有进程的名称/路径/内存占用/CPU占用.
1 |
|