(1)错误处理
Windows函数通常以以下几种方式表示函数调用出错:
一旦函数调用出错,应立即调用GetLastError来取回错误代码。
DWORD GetLastError()
GetLastError返回存储于线程局部存储(TLS)的错误代码,因此多线程情况下各个线程的错误代码不会互相干扰。
所有的错误代码可以在WinError.h中找到,每个错误都有三个相关信息:
- 错误消息ID(一个宏);
- 错误消息文本;
- 错误编号(应避免直接使用,应尽量使用错误消息ID)
Visual Studio可以在Watch中监视线程错误代码和文本,只需在Watch窗口输入@err,hr
向用户显示错误信息:
使用FormatMessage来向用户展示错误信息,该函数可支持多种自然语言。
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *arguments);
示例代码如下:
DWORD dwError=ERROR_PATH_NOT_FOUND; //ERROR_SUCCESS;
HLOCAL hLocal=NULL;
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
BOOL fOK = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, systemLocale, (PTSTR)&hLocal, 0, NULL);
If (!fOK) {
HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
If (hDll != NULL){
fOK = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, systemLocale, (PTSTR)&hLocal, 0, NULL);
FreeLibrary(hDll);
}
}
If (fOK && (NULL != hLocal)){
tcout<<(PCTSTR)LocalLock(hLocal)<<endl;
LocalFree(hLocal);
}
自定义错误代码
使用SetLastError可以设置我们认为合适的32错误代码
VOID SetLastError(DWORD dwErrCode);
错误代码各个字段如下:
(EOF)