各种返回类型的Windows函数执行中出现错误时的返回值为:
VOID,不可能出现错误,没有返回值。
BOOL,错误返回0,否则为非0。
HANDLE,错误一般返回NULL或INVALID_HANDLE_VALUE(-1),否则为有效HANDLE值。
PVOID,错误返回NULL,否则返回有效指针。
LONG/DWORD,错误通常返回0或-1,但不可一概而论,具体以platform SDK的相关文档为准。
GetLastError函数,windows有一种叫作Thread-Local Storage的机制,当本线程的windows函数返回时,同时得到其执行错误时的相应的错误代码。这些错误代码在winerr.h中得到定义。GetLastError返回的是最后一个执行的函数相对应的错误代码,可能被下一个函数的执行结果(即使是执行成功)覆盖。
每个错误都有三种表达方式:纯数字,如2;相应的在winerr.h中定义的宏,如ERROR_ALREADY_EXISTS;相应的文字描述,可以从FormatMesage函数或VS的tool/error lookup工具中得到;VS在调试状态时有一种比较便捷的方式可以即时看到当前错误代码及描述,在Watch窗口中输入”@err,hr”(VS6.0)或”$err.hr”(VS2005),其中’hr’的作用是得到错误描述。
ForamtMesaage函数是一个不错的得到错误文字描述信息并显示出来的手段,而且可以选择不同的语言,比较扯的是,前提是要在资源中为这些描述信息进行翻译。
SetLastError函数,用来给自己写的函数定义32位ERROR值,需要注意的是,如果这个ERROR值不沿用windows系统winerr.h文件中已定义的值而是自己定义的话,为了不与微软的现有或保留值相冲突需要注意:(31-0位中)第29位必须为1,27-16位(共有4096个值)的前256个值不能使用。下为具体各位的含义,引用自window via c/c++书中原文:
Bits: | 31-30 | 29 | 28 | 27-16 | 15-0 |
---|---|---|---|---|---|
Contents | Severity | Microsoft/customer | Reserved | Facility code | Exception code |
Meaning | 0=Success 1 = Informational 2 = Warning 3 = Error | 0 = Microsoft-defined code 1 = customer-defined code | Must be 0 | The first 256 values are reserved by Microsoft | Microsoft/customer-defined code |