错误处理
调用
windows
函数时,它会先验证我们传给它的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败了。在内部,
windows
函数检测到错误了,它会使用一种名为"线程本地存储区"的机制将相应的错误代码与主调线程关联到一起。这种机制使不同的线程能独立运行,不会出现相互干扰对方的错误代码的情况。当函数返回时,其返回值会指出已发生一个错误。要查看具体的信息,得调用
GetLastError
函数。windows
函数失败之后,应该马上调用GetLastError
,因为如果又调用了一个别的windows
函数,则可能GetLastError
对应的信息也是被改成别的内容了。函数调用成功时,值被改成ERROR_SUCCESS
了。可以在VS里面监视
GetLastError
的相关信息,通过输入$err,hr
实现。
FormatMessage
1 2 3 4 5 6 7 8 |
DWORD FormatMessage( DWORD dwFlags, LPCVOID pSource, DWORD dwMessageId, DWORD dwLanguageId, PTSTR pszBuffer, DWORD nSize, va_list* Arguments); |
可以向用户显示错误的文本描述。
定义自己的错误代码
为了指出错误,只需设置线程的上一个错误代码,然后令自己的函数返回
FALSE
,INVALID_HANDLE_VALUE
,NULL
或其他合适的值。调用下面的函数:
1 |
VOID SetLastError(DWORD dwErrCode); |
错误代码的字段:
位 | 31-30 | 29 | 28 | 27-16 | 15-0 |
内容 | 严重性 | Microsoft/客户 | 保留 | Facility代码 | 异常代码 |
含义 | 0,成功 | 0,Microsoft | 0 | 前256个值 | Microsoft/客户 |
含义 | 1,提示 | 1,客户 | 0 | 由Microsoft | 定义的代码 |
含义 | 2,警告 | 0 | 保留 | ||
含义 | 3,错误 | 0 |
字符和字符串处理
安全函数
所有安全函数的首要任务是验证传给它们的参数值。要坚持的内容包括:
- 指针不为
NULL
- 整数在有效范围内
- 枚举值是有效的
- 缓冲区足够容纳结果数据
任何一项检查失败,函数都会设置局部于线程的C运行时变量
errno
。并返回一个errno_t
值来指出成功或失败。
Windows字符串函数
MultiByteToWideChar
- 将多字节字符串转换为宽字节字符串
1 2 3 4 5 6 7 |
int MultiByteToWideChar( UINT uCodePage, DWORD dwFlags, PCSTR pMultiByteStr, int cbMultiByte, PWSTR pWideCharStr, int cchWideChar); |
- 标识了与多字节字符串关联的一个代码页值
- 允许我们进行额外的控制(影响带变音符号的字符)
- 指定要转换的字符串
- 指定字符串的长度。如果这个值是-1,函数返回源字符串的长度
- 待写入缓冲区的内存地址
- 缓冲区的最大长度
WideCharToMultiByte
- 将宽字符串转化为多字节字符串
1 2 3 4 5 6 7 8 9 |
int WideCharToMultiByte( UINT uCodePage, DWORD dwFlags, PCWSTR pWideChatStr, int cchWideChar, PSTR pMultiByteStr, int cbMultiByte, PCSTR pDefaultChar, PBOOL pfUsedDefaultChar); |
- 标识了与新转换的字符串关联的一个代码页值
- 允许我们进行额外的控制(影响带变音符号的字符)
- 待转换字符串的内存地址
- 指定字符串的长度。如果这个值是-1,函数返回源字符串的长度
- 指定的缓冲区
- 缓冲区的最大大小
- 在遇到一个不能转换的宽字符时,函数使用pDefaultChar指向的参数
- 如果至少有一个不能转换为对应的多字节形式,函数会把这个变量设为TRUE。如果所有字符都成功转换,会把这个变量设为FALSE。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Windows 核心编程 _ 内核对象二06/07
- ♥ Spy++相关08/18
- ♥ Soui四05/23
- ♥ Soui七06/02
- ♥ Cef:沙盒、CefApp、CefClient02/29
- ♥ Windows 核心编程 _ 进程一06/07