第一部分,必备知识
第1章 错误处理
概述: 当调用Windows函数失败时,必须正确处理错误代码以确定失败原因。Windows通过函数返回值指示错误,并通过线程局部存储机制保存详细的错误代码供后续查询。
Windows函数的错误指示方式
VOID ExitProcess(UINT uExitCode);
BOOL CloseHandle(HANDLE hObject); HANDLE hFile = CreateFile(...); if (!CloseHandle(hFile)) { DWORD dwError = GetLastError(); }
HANDLE hFile = CreateFile( TEXT("test.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) { DWORD dwError = GetLastError(); }
PVOID pvMem = VirtualAlloc(NULL, 1024, MEM_RESERVE, PAGE_READWRITE); if (pvMem == NULL) { DWORD dwError = GetLastError(); }
DWORD dwNum = GetCurrentProcessId();
|
DWORD GetLastError();
void ErrorExit(LPTSTR lpszFunction) { LPVOID lpMsgBuf; DWORD dw = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
printf("Function: %s\nError: %s\n", lpszFunction, (LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf); ExitProcess(dw); }
|
错误代码的位域结构与自定义错误
void MyFunction() { SetLastError(ERROR_MY_CUSTOM_ERROR); }
|
ErrorShow示例程序:错误代码查询工具
总结:
永远不要忽略Windows函数的返回值,必须检查是否成功。不同函数的错误指示方式不同,需查阅SDK文档确认(如CreateFile失败返回INVALID_HANDLE_VALUE而非NULL)。错误代码具有线程局部性,每个线程维护自己的最后错误代码。使用GetLastError获取详细错误信息,使用FormatMessage转换为可读文本。使用WinError.h中的宏定义而非数字值表示错误代码。