总结:
Win32API,通常有以下有种返回值:
(1)VOID,表示对其的调用 不可能失败,这种API很少;
(2)BOOL;
(3)HANDLE,该返回值用来标识一个对象,失败的时候返回INVALID_HANDLE_VALUE(-1)或NULL;
(4)PVOID,标识内存块的地址,失败的时候返回NULL;
(5)LONG/DWORD,通常用来返回一个数量,失败的时候返回0或-1.
在内部,当函数检测到一个错误的时候,它将使用线程本地存储器机制,将相应的错误代码号与调用线程联系起来,可以用:
DWORD GetLastError();
得到该线程的最后一个错误。通常,一个函数成功后,不会改写错误代码,但也有例外,如,CreateEvent创建一个命名的事件对象时,如果存在同名对象,将返回一个复制的句柄,也是成功运行,这个时候用GetLastError确定 一些其他信息。还有,Win98中由于历史的原因有些API不能设置错误代码。
在WinError.h中定义了错误代码和相应的英文描述。
用函数:
DWORD FormatMessage(DWORD dwFlags, //FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER是从系统中取错误信息的文本,并由该函数 //为字符串分配内存
LPCVOID lpSource,//取错误消息时可以忽略它
DWORD dwMessageID,//错误号
DWORD dwLanguageID, //默认指定0即可
PTSTR pszBuffer,
DWORD dwSize,//不由函数分配内在时指定缓冲的大小
va_list *Atguments);
可以得到错误代码对应的文本。
也可以用下面的函数:
VOID SetLastError(DWORD dwError);
设置最后错误代码,这个值可以是系统定义,也可以是自定义的。错误代码是有讲究的:30-31位指定错误程度:成功-供参考-警告-错误;29位为1是自定义的;28位为0;16-27位设备代码;0-15位异常代码。
VC的调试器支持参最后错误代码的跟踪。在Watch窗口(在断点位停止时),在Watch窗口的一行的Name中输入“@err,hr”,在这里就能跟踪显示最后错误代码。