Windows核心编程 第一章 错误处理

1. 常见返回值类型:

返回值类型为VOID 型 :这种函数不可能失败!

返回值类型为BOOL 型 :应避免测试返回值是否为TRUE,最稳妥的做法是检查它是否不为FALSE

返回值为 HANDLE 型 :函数若是失败,返回NULLHANDLE变量将表示一个可操纵对象。有些函数发生错误将返回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 }

 

 

 

posted @ 2013-05-12 21:41  左懒  阅读(403)  评论(0编辑  收藏  举报