Windows核心编程 第一章 错误处理
1. 常见返回值类型:
返回值类型为VOID 型 :这种函数不可能失败!
返回值类型为BOOL 型 :应避免测试返回值是否为TRUE,最稳妥的做法是检查它是否不为FALSE。
返回值为 HANDLE 型 :函数若是失败,返回NULL,HANDLE变量将表示一个可操纵对象。有些函数发生错误将返回INVALID _HANDLE_VALUE。
返回值为类型LONG/DWORD型 :较为复杂,调用前应阅读SDK文档
2. 当Windows函数检测到错误时,它会使用一种名为“线程本地存储区”的机制将相应的错误码与“主调线程”(发生调用的线程) 关联到一起。这种机制使不同的线程能独立运行,不会出现相互干扰对方的错误代码的情况。函数返回时,其返回值会指出已发生一个错误。可调用GetLastError函数查看错误码。
3. Windows函数失败之后,应该马上调用GetLastError获取错误码,假如没有调用GetLastError获取错误码而调用另一个Windows函数,则此值可能被改写。调用成功将返回ERROR_SUCCESS。
4. 可在VS编辑器中的Watch窗口使用$err,hr查看“上一个错误码”。
5. 使用SetLastError 可设置自己函数的返回错误码。尽量使用winerror.h中现有的错误码。
示例代码:
1 /*************************************************************************************************** 2 * DWORD FormatMessage( DWORD dwFlags, // source and processing options 3 * LPCVOID lpSource, // message source 4 * DWORD dwMessageId, // message identifier 5 * DWORD dwLanguageId, // language identifier 6 * LPTSTR lpBuffer, // message buffer 7 * DWORD nSize, // maximum size of message buffer 8 * va_list *Arguments // array of message inserts); 9 * FORMAT_MESSAGE_FROM_SYSTEM 获得与一个系统定义的错误代码对应的字符串 10 * FORMAT_MESSAGE_ALLOCATE_BUFFER 要求该函数分配一块足以容纳错误文本描述的内存 11 * FORMAT_MESSAGE_IGNORE_INSERTS 传入这个参数则不用为Arguments传参。 12 * dwLanguageId 指定用什么语言显示内容,0则使用系统默认语言 13 * 14 ***************************************************************************************************/ 15 16 #include <winerror.h> 17 #include <windows.h> 18 #include <iostream> 19 using namespace std; 20 21 int main (void) 22 { 23 HLOCAL hlocal = NULL; 24 DWORD dwError = 0; 25 BOOL isSuccess; 26 do{ 27 cout << "请输入一个错误码:"; 28 cin >> dwError ; 29 30 isSuccess = FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | 31 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, NULL, (char *)&hlocal, 0, NULL); 32 33 if (isSuccess) 34 { 35 cout << "错误消息: " << (char *)LocalLock(hlocal) << endl; 36 LocalFree(hlocal); 37 } 38 } 39 while (true); 40 41 return 0; 42 }