- /*
- 1:定义自己的错误码
- 微软的错误码返回机制也适用于我们自己写的函数。
- 为了表示一个错误,通常情况下设置一个线程的最后错误码然后函数再返回一个
- 不可用值就可以了,比如NULL,FALSE,INVALID_HANDLE_VALUE等任何想返回的值。
- 设置线程的最后错误码可以使用函数:
- VOID SetLastError(DWORD dwErrCode);
- 这个函数需要一个32位的数值,任意值,通常情况下,如果函数返回的错误与MS
- 在WinError.h中定义的错误码相符,最好还是用MS已经定义的错误码。如果你
- WinError.h中找不到适合自己函数的错误码,我们也可以创建自己的错误码,但
- 错误码的各个位都有其要求,具体如下:
- 15-0位:
- 表示异常码,可以是MS定义的,也可以是我们自己定义的
- 27-16位:
- 设备码,这12位可以表示4096个设备码,但前256个被MS保留它用。
- 28位:
- 保留位,必须为0
- 29位:
- 错误码所属类别位,0表示错误码是由MS定义的,1表示是由用户定义的。
- 31-30位:
- 错误码类型位,0表示成功,1表示信息,2表示警告,3表示失败
- */
- /*
- 2:显示错误的例子
- 通过错误码获取错误的描述,关键是使用函数FormatMessage,例子如下:
- */
- //获取错误码
- DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);
- HLOCAL hlocal = NULL; // Buffer that gets the error message string
- //通过语言的主标识符和子标识符得到一个语言标识符
- DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
- /*
- 函数成功时返回描述内容的长度,以TCHAR为单位,失败时返回0
- */
- BOOL fOk = FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM |
- //此标识意为系统定义的错误码的描述
- FORMAT_MESSAGE_IGNORE_INSERTS |
- //此标识意为可在描述中使用%以显示更多的信息
- FORMAT_MESSAGE_ALLOCATE_BUFFER,
- //此标识意为函数内部申请足够容纳下整个描述的空间
- NULL,
- //只要第一个参数中不包括FORMAT_MESSAGE_FROM_HMODULE
- //或FORMAT_MESSAGE_FROM_STRING,第二个参数就没有
- //意义,可设置为NULL
- dwError, //错误码
- systemLocale,//错误码的描述语言
- (PTSTR) &hlocal,//描述内容数据块的指针
- 0,
- //当第一个参数中指定了FORMAT_MESSAGE_ALLOCATE_BUFFER
- //则此参数的意思是要申请的最小TCHAR的数目
- //如果没有指定这个标识,这个参数需要传递描述内容
- //的长度,以TCHAR为单位
- //此参数的最大长度不可大于64KB
- NULL);
- if (!fOk)
- {
- //如果上面提取描述的过程失败,则检查一下是不是网络的原因
- HMODULE hDll = LoadLibraryEx(
- TEXT("netmsg.dll"),
- NULL,
- DONT_RESOLVE_DLL_REFERENCES);
- if (hDll != NULL)
- {
- /*
- 在这里再次调用FormatMessage,显示网络检查的结果
- */
- fOk = FormatMessage(
- FORMAT_MESSAGE_FROM_HMODULE |
- FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_ALLOCATE_BUFFER,
- hDll,
- dwError,
- systemLocale,
- (PTSTR) &hlocal,
- 0,
- NULL);
- FreeLibrary(hDll);
- }
- }
- if (fOk && (hlocal != NULL))
- {
- //显示错误描述
- SetDlgItemText(
- hwnd,
- IDC_ERRORTEXT,
- (PCTSTR) LocalLock(hlocal));
- LocalFree(hlocal);
- }
- else
- {
- SetDlgItemText(
- hwnd,
- IDC_ERRORTEXT,
- TEXT("No text found for this error number."));
- }