函数错误处理二(总结自己windows编程核心)

  1. /*
  2.     1:定义自己的错误码
  3.     微软的错误码返回机制也适用于我们自己写的函数。
  4.     为了表示一个错误,通常情况下设置一个线程的最后错误码然后函数再返回一个
  5.     不可用值就可以了,比如NULL,FALSE,INVALID_HANDLE_VALUE等任何想返回的值。
  6.     设置线程的最后错误码可以使用函数:
  7.         VOID SetLastError(DWORD dwErrCode);
  8.     这个函数需要一个32位的数值,任意值,通常情况下,如果函数返回的错误与MS
  9.     在WinError.h中定义的错误码相符,最好还是用MS已经定义的错误码。如果你
  10.     WinError.h中找不到适合自己函数的错误码,我们也可以创建自己的错误码,但
  11.     错误码的各个位都有其要求,具体如下:
  12.     
  13.     15-0位:
  14.         表示异常码,可以是MS定义的,也可以是我们自己定义的
  15.     27-16位:
  16.         设备码,这12位可以表示4096个设备码,但前256个被MS保留它用。
  17.     28位:
  18.         保留位,必须为0
  19.     29位:
  20.         错误码所属类别位,0表示错误码是由MS定义的,1表示是由用户定义的。
  21.     31-30位:
  22.         错误码类型位,0表示成功,1表示信息,2表示警告,3表示失败
  23. */
  24. /*
  25.     2:显示错误的例子
  26.     通过错误码获取错误的描述,关键是使用函数FormatMessage,例子如下:
  27. */
  28. //获取错误码
  29. DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);
  30. HLOCAL hlocal = NULL;   // Buffer that gets the error message string
  31. //通过语言的主标识符和子标识符得到一个语言标识符
  32. DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
  33. /*
  34.     函数成功时返回描述内容的长度,以TCHAR为单位,失败时返回0
  35. */
  36. BOOL fOk = FormatMessage(
  37.                          FORMAT_MESSAGE_FROM_SYSTEM     |
  38.                          //此标识意为系统定义的错误码的描述
  39.                          FORMAT_MESSAGE_IGNORE_INSERTS  |
  40.                          //此标识意为可在描述中使用%以显示更多的信息
  41.                          FORMAT_MESSAGE_ALLOCATE_BUFFER,
  42.                          //此标识意为函数内部申请足够容纳下整个描述的空间
  43.                          NULL, 
  44.                          //只要第一个参数中不包括FORMAT_MESSAGE_FROM_HMODULE
  45.                          //或FORMAT_MESSAGE_FROM_STRING,第二个参数就没有
  46.                          //意义,可设置为NULL
  47.                          dwError, //错误码
  48.                          systemLocale,//错误码的描述语言
  49.                          (PTSTR) &hlocal,//描述内容数据块的指针
  50.                          0,
  51.                          //当第一个参数中指定了FORMAT_MESSAGE_ALLOCATE_BUFFER
  52.                          //则此参数的意思是要申请的最小TCHAR的数目
  53.                          //如果没有指定这个标识,这个参数需要传递描述内容
  54.                          //的长度,以TCHAR为单位
  55.                          //此参数的最大长度不可大于64KB
  56.                          NULL);
  57. if (!fOk) 
  58. {
  59.     //如果上面提取描述的过程失败,则检查一下是不是网络的原因
  60.     HMODULE hDll = LoadLibraryEx(
  61.                                 TEXT("netmsg.dll"),
  62.                                 NULL,
  63.                                 DONT_RESOLVE_DLL_REFERENCES);
  64.     if (hDll != NULL)
  65.     {
  66.         /*
  67.             在这里再次调用FormatMessage,显示网络检查的结果
  68.         */
  69.         fOk = FormatMessage(
  70.                             FORMAT_MESSAGE_FROM_HMODULE     |
  71.                             FORMAT_MESSAGE_IGNORE_INSERTS   |
  72.                             FORMAT_MESSAGE_ALLOCATE_BUFFER,
  73.                             hDll,
  74.                             dwError,
  75.                             systemLocale,
  76.                             (PTSTR) &hlocal,
  77.                             0,
  78.                             NULL);
  79.         FreeLibrary(hDll);
  80.     }
  81. }
  82. if (fOk && (hlocal != NULL)) 
  83. {
  84.     //显示错误描述
  85.     SetDlgItemText(
  86.                     hwnd,
  87.                     IDC_ERRORTEXT,
  88.                     (PCTSTR) LocalLock(hlocal));
  89.     LocalFree(hlocal);
  90. }
  91. else 
  92. {
  93.     SetDlgItemText(
  94.                     hwnd,
  95.                     IDC_ERRORTEXT,
  96.                     TEXT("No text found for this error number."));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值