【Windows 核心编程】Windows 核心编程 -- 错误处理
一,常见的Windows函数返回值类型
1)VOID:这个函数不可能失败,极少数Windows函数的返回值类型为VOID。
VOID ExitProcess(UINT uExitCode);
2)BOOL:如果函数失败,返回值为0;否则,返回值是一个非0值。应避免测试返回值是否为TRUE,应该检查是否不为FALSE。
BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);
为什么不能使用if (result == TRUE),而要使用if (result != FALSE)。从反汇编代码的效率以及指令长度上没有什么区别。
但是主要在0、1的判断,0是单独个体,但是1需要理解为非0就对了,但是机器只是跟1来比较,所以缩小了范围。
3)HANDLE:如果函数失败,返回值通常为NULL;否则HANDLE将标识一个可以操作的对象。但是有时候失败的时候返回的值为INVALID_HANDLE_VALUE,被定义为-1。HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);
4)PVOID:如果函数调用失败,则返回值为NULL;否则PVOID将标识一个数据块的内存地址
5)LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
6) LONG/DWORD:返回具体的LONG/DWORD数值,需要根据MSDN的提示进行正确判断。
7)DWORD GetCurrentProcessId(VOID);
二,函数错误返回码
Windows函数检测到错误的时候,它会使用一种名为“线程本地存储区”的机制将相应的错误代码与调用线程关联到一起,使得不同线程的错误代码不互相干扰。
GetLastError()
此函数的作用很简单,就是返回由上一个函数调用设置的线程的32位错误码。WinError.h头文件包含了MiscrSoft定义的错误代码列表。
Windows函数调用失败之后,要马上调用该函数,不然可能在调用了另一个Windows函数后,LastError将会被改写(Windows函数调用成功以后可能会把此值改写成ERROR_SUCCESS)。之前见过一下两种方法,使用GetLastError(),都应该在后续编程时尽量将程序的容错性、健壮性提高。
代码 1:
#include <stdio.h>#include <windows.h>int main(){ DWORD dwError = 0; printf("请输入要查询的错误代码:"); scanf("%d", &dwError); HLOCAL hLocal = NULL; DWORD SystemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, //请求的消息的消息标识符 SystemLocale, //语言标识符 (PTSTR)&hLocal, //缓冲区保存格式化消息,并且通过lpBuffer指向该地址。 0, NULL);if(hLocal!=NULL){MessageBox(NULL,(PCTSTR)LocalLock(hLocal),L"Title(错误内容)",MB_OK); // LocalLock(hLocal);} printf("查询失败:没有对应错误代码\n");getchar(); return -1;}