开始windows编程之前,要了解windows函数是怎么做错误处理的。
当调用一个windows函数的时候。它首先检查传递给它的各个参数的有效性,然后再设法做处理。
当传入一个错误的参数或操作在处理过程中出现不成功,则返回一个值。
当返回值是VOID的时候,是不可能错误的。
当返回值是LONG/DWORD的时候。windows处理比较复杂。一般如果返回0或-1 表示不能计数。
Microsoft公司编译了一个错误表,为每个错误分配一个32位的号码。当发生错误的时候。可以调用GetLastError()函数,得到最近的错误。注意:该函数只返回32位的错误号。
WinError.h中包含了错误代码的列表。这个文件的列表内容是这样的:
//MessageId: ERROR_SUCCESS
//MessageText:
//
//The operation completed successfully.
//
#define ERROR_SUCCESS 0L
... ...
每个错误都是这样描述的:错误ID号,错误文本,错误号码(一般,应该避免使用号码,可以使用ID号)。
同时记住:当windows函数运行失败,请立即运行GetLastError()函数进行错误处理。但是,当windows函数运行成功,它就不会改写错误代码,并不指明运行成功。(当然有例外)
在windows98中,不能使用这种机制来发现错误。因为,windows98很大部分是16位函数。
在调试的时候,在Watch窗口中输入“@err,hr”,就可以显示最后一个函数调用时的错误号码和错误英文描述文本
如果在程序编写中,想把错误显示给用户看,windows提供了一个函数:FormatMessage定义如下:
DWORD FormatMessage(DWORD dwFlags , LPCVOID pSource , DWORD MessageID , DWORD dwLanguageID ,
PTSTR pszBuffer , DWORD nSize , va_list * Arguments );
FormatMessage()函数的功能非常丰富,向用户显示消息,它是首选函数。后面会展示该函数的用法。
以上是windows的错误处理机制,你也可以在你的程序中使用这种机制。
将你认为合适的号码传给windows的线程池调用下面的函数:SetLastError(DWORD dwErrCode);
最好,能在WinError.h中存在的错误号。如果你实在是找不到反映你实际需要代码,可以自己创建错误号。
错误号可以划分域的:31~30 表示严重性(0 表示成功 1 表示供参考 2 表示警告 3 表示错误)
29 表示是用户定义的错误号还是是Microsoft定义:0 表示是Microsoft定义的 1 表示用户定义的。
28 是保留 必须是0 。
27~16 设备代码,由Microsoft定义。
15~0 错误代码,由Microsoft或用户定义。
这些,还会在以后的文章中涉及!
下面开始是一个示例程序,重点展示如何使用FormatMessage函数: