Windows核心编程

Windows核心编程

0x00-错误处理

在WinError.h头文件中包含了Microsoft定义的错误代码列表,每个错误都有三种表示:一个消息ID(一个可在源代码使用的宏,用于与GetLastError的返回值进行比较)、消息文本(描述错误的英文文本)和一个编号(应该避免使用此编号,尽量使用消息ID)

所以在Windows函数失败之后,应该立马调用GetLastError()

0x01-字符和字符串处理

ANSI与UNCODE

在Windows Vista中,每个Unicode字符都使用UTF-16编码,UTF-16将每个字符编码为2个字节也就是16位

我们知道在C语言中,char数据类型表示一个8位ANSI字符,也就是一个字节

当我们声明Unicode字符和字符串时,只需要在字符串前加上”L“,表示以UTF-16来编码每个字符

Unicode函数与ANSI函数

自Windows NT起,Windows所有的版本都完全用Unicode来构建。也就是说所有核心函数(创建窗口、显示文本、进行字符串处理)都需要Unicode字符串

在Windows中,Windows函数通常具有两个版本,用于接收不同的字符串

默认版本

C运行库中的Unicode函数和ANSI函数

和Windows函数一样,C运行库提供了一系列函数处理ANSI字符和字符串,并提供了一系列函数来处理Unicode字符与字符串

在C运行库中,strlen就是一个能返回ANSI字符串长度的函数。与之对应的是wcslen,这个C运行库函数能返回Unicode字符串的长度,这两个函数都在string.h中

C运行库中的安全字符串函数

任何修改字符串的函数都存在一个安全隐患:如果目标字符串缓冲区不够大,无法容纳所生成的字符串,就会导致内存中的数据被破坏

例子

为了防止被被恶意软件肆意滥用,微软提供了一系列新的函数来取代C运行库的不安全的字符串处理函数

书中没有详细介绍,可以自行查找

安全字符串函数

安全字符串函数执行

Windows字符串函数

不知道讲了些啥

为何要用Unicode