数据类型 表示失败的值
VOID 该函数的运行是不可能失败的。这种函数在Widows中很少见。
BOOL 如果函数运行失败则返回0,否则返回非0值。调用这些函数时最好对函数的返回值进
行测试。测试时请与0进行比较。不要与TRUE进行比较
HANDLE 如果运行失败,返回值通常为空,否则返回值为HANDLE,用于标识你可以操作的一个对象。注意:有些函数会返回一个句柄值INVALID_HANDLE_VALUE,它定义为-1.
PVOID 如果函数运行失败,则返回NULL,否则返回PVIOD,以标识数据块的内存地址。
LONG/DWORD 有点难处理,返回值通常是LONG或者DWORD。如果由于某种原因,函数如果没发对想要计数的对象计数的话,那么该函数返回0或者-1(根据函数而定),如果返回的值是LONG/DWORD的话,有可能该值不是正确的值
现在我们知道了函数返回值哪些是错误的了。如果想知道为什么会返回一个错误的值,那么请调用:
GetLastError函数:DWORD GetLastError();注意,该函数返回线程的32位错误代码(错误码对应的错误在WinError.h文件中)。如下:
#define ERROR_FILE_NOT_FOUND 2L
//
// MessageId: ERROR_PATH_NOT_FOUND
//
// MessageText:
//
// The system cannot find the path specified.
//
#define ERROR_PATH_NOT_FOUND 3L
//
// MessageId: ERROR_TOO_MANY_OPEN_FILES
//
// MessageText:
//
// The system cannot open the file.
//
如上所见:每个错误代码都由三部分组成:消息ID(可以在源代码中使用的宏,以便与GetLatError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(应该避免使用,请使用消息ID)。
最后,Windows函数运行失败时请立即调用GetLastError函数。如果调用其他的Windows函数,他的值就很有可能被改写。
如何获取WinError.h文件中定义的错误描述?
当在编写应用程序时需要把错误信息显示给用户,请使用FormatMessage函数,该函数将错误代码转换为文本描述。函数原型如下:(该函数很有用,比方说很容易实现多国语言的互换)
har szError[256];
DWORD dwError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
0,
0,
szError,
sizeof(szError),
NULL);
AfxMessageBox(szError);
如何定义自己的错误代码?
上面讲到了Windows函数如何向函数的调用者指明发生错误,现在我们看看如何使自己的函数也有报告错误的功能。
适用场所:当你写一个他人调用的函数,你的函数可能因为种种原因而调用失败,你必须告诉函数的调用者该函数运行失败,但是你还想通知函数调用者该函数为什么失败(很不错哦,这样就与Windows只带的函数一样了哈,是不是很不错哦)。
若要指明函数调用失败,只需要设定线程的最后错误代码,然后让你的函数返回FLASE、INVALID_HANDLE_VALUE、NULL或者其他约定的信息。请使用如下方法设定线程的最后错误代码。
函数原型:
void SetLastError(
DWORD dwErrCode //请使用WinError.h文件中已经存在的错误代码。当然也可以创建自己的错误代码,一般情况下没有必要。 );