Windows返回值类型:VOID:函数不可能执行失败
BOOL:失败返回0;否则非0(最好检测是否为0)
HANDLE:失败返回NULL或INVALID_HANDLE_VALUE(-1);否则返回可操作对象
PVOID:失败返回NULL;否则返回标识的数据块内存地址
LONG/DWORD:一般用于返回数量的函数;在com中用于指针地址
DWORD GetLastError();
该函数返回线程的32位错误代码,此函数应该被立即调用,如果调用了其它的Windows函数,旗值可能会被改写
VOID SetLastError(DWORD dwErrCode);
设置线程的最后错误代码,可以是Windows定义的,也可以是自己定义的
@err,hr 监控线程的最后错误代码
错误代码域说明:0-15 异常代码-可以是Microsoft定义的也可以是用户定义的
16-27 设备代码,必须由Microsoft定义
28 保留,必须为0
29 0-Microsoft定义的错误代码;1为用户定义的
30-31 严重性:0-成功;1-供参考;2-警告;3-错误
FormatMessage(); 格式化错误消息,取得文本描述
PTSTR CharNext(PCTSTR pszCurrentChar);
PTSTR CharNext(PCTSTR pszStart,PCTSTR pszCurrentChar);
BOOL IsDBCSLeadByteTRUE(BYTE bTestChar); 判断字节是否为多字节字符的前导字节
下面附上FormatMessage()使用的简单使用代码:
其中的is_win32_error判断错误码是否为系统定义(29位为0系统定义,为1用户定义的错误码)
void format_win_error_message(DWORD dwErrCode,TCHAR *tcErrMess,int nBuffLen,bool bChinese)
{
if(tcErrMess == NULL) return;
DWORD errnoo = dwErrCode;//GetLastError();
_tcscpy(tcErrMess,_T(""));
bool bWin32 = is_win32_error(errnoo);
HLOCAL hLoc = NULL;
DWORD lgFlag = 0;
if(bChinese == false)
{
lgFlag = MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
if(bWin32 == false)
{
_tcsncpy(tcErrMess,_T("The error code is defined by user"),nBuffLen);
return;
}
else
{
_tcsncpy(tcErrMess,_T("The ERROR code is undefined"),nBuffLen);
}
}
else
{
lgFlag = MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);
if(bWin32 == false)
{
_tcsncpy(tcErrMess,_T("此错误代码由用户定义"),nBuffLen);
return;
}
else
{
_tcsncpy(tcErrMess,_T("无定义的错误代码"),nBuffLen);
}
}
BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,errnoo,lgFlag,(LPTSTR)&hLoc,0,NULL);
if(hLoc != NULL)
{
_tcsncpy(tcErrMess,(LPTSTR)LocalLock(hLoc),nBuffLen);
LocalFree(hLoc);
}
}