1、常见的windows函数返回类型
1 VOID //不返回任何类型,不会失败 2 3 BOOL //TRUE for FALSE, typedef int BOOL 4 5 HANDLE //句柄类型,函数失败返回NULL 或 INVALID_HANDLE_VALUE,后者INVALID_HANDLE_VALUE被定义为宏((HANDLE)(LONG_PTR)-1), 其中LONG_PTR被定义为 6 7 //Typedef _W64 long LONG_PTR, *PLONG_PTR, LONG_PTR在VC++ WIN32配置下为32位,在X64配置下为64位。 8 9 PVOID //PVOID被定义为typedef void *PVOD; 如果函数失败返回NULL,否则返回一个标志内存块的指针 10 11 LONG/DWORD //其返回值代表的含义需要根据MSDN的解释来,没有固定招数,其中DWORD被定义为unsigned long
2、关于错误代码
1 DWORD GetLastError(); 2 3 错误代码在winerror.h中定义 4 5 #define ERROR_SUCCESS 0L 6 7 #define NO_ERROR 0L 8 9 //MessageID GetLastError返回值 10 11 //MessageText 错误描述信息
一个windows函数失败之后应该立即调用GetLastError获得其错误代码,当windows检测到错误时会使用“线程本地存储(Thread-Local-Storage)”的机制来将相应的错误代码和主调线程关联到一起。
调试程序时,在Visual Studio的watch窗口Name字段中输入:$err,hr ,这样在调试时即可随时查看windows函数的GetLastError的值和对应的描述信息。
根据错误代码获得其对应的文本描述信息的方法:
1 DWORD FormatMessage( 2 3 DWORD dwFlags, //标记 4 5 LPCVOID pSource, //表明这个值是消息资源来自哪里,依赖dwFlags 6 7 DWORD dwMessageId, //错误代码 8 9 DWORD dwLanguageId, //错误描述信息的语言 10 11 PTSTR pszBuffer, //接收错误描述信息的输出缓冲区 12 13 DWORD nSize,//如果FORMAT_MESSAGE_FROM_ALLOCATE_BUFFER则这个参数设置以TCHARs为单位的输出缓冲区最小尺寸,不能大于64KB 14 15 Va_list *Argumentgs 16 17 ); 18 19 20 21 //Eg. 22 23 HLOCAL hLocal = NULL; 24 25 BOOL bRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, 26 27 NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), 28 29 (PTSTR)&hLocal, 0, NULL 30 31 ); 32 33 34 35 if(TRUE == bRet) 36 37 { 38 39 CString str(_T(“错误信息:”)); 40 41 AfxMessageBox(str + CString((LPWSTR)LocalLock(hLocal)) ); 44 45 LocalFree(hLocal); 47 }
3、定义自己的错误代码
1 VOID SetLastError(DWORD dwErrCode);
关于DWORD表示的32位数中,从低位0---高位31位,
0—15位为MS/客户定义的代码;
16-27位中,前256个值由MS保留,剩余的供客户定义;
第28位必须为0,第29位为0表示MS定义的代码,为1表示客户定义的代码,这样保证MS和客户的定义的不会重复;
30—31中,0表示成功,1表示信息提示,2表示警告,3表示错误。
4、Visual Studio的工具菜单中一般都会有一个【错误查找】的命令,如果没有则到VS的开始菜单或者安装目录下查找这个工具,这个工具可以用来根据错误代码查找错误描述信息。