windows程序员想要知道系统出错信息,一般使用GetLastError()来获取,该API获取的是错误码,如通过GetLastError返回123 我们可以查询VS自带工具errorloop得到出错码123的错误信息:文件名、目录名或卷标语法不正确。这是一件挺麻烦的事。所以如果开发过程中我们能直接得到错误码的错误信息,那就好了,下文正是实现如此功能。

void ErrorShowString(DWORD dwErrorCode,LPSTR szErrorStr)
{
	DWORD dwError=dwErrorCode;
	HLOCAL hlocal=NULL;
	
	DWORD systemLocale=MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
	BOOL bOK=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|
		FORMAT_MESSAGE_ALLOCATE_BUFFER,
		NULL,dwError,systemLocale,(PTSTR)&hlocal,0,NULL);
	if (!bOK)
	{
		HMODULE hDll=LoadLibraryEx("netmsg.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
		if(hDll)
		{
			bOK=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE|
				FORMAT_MESSAGE_IGNORE_INSERTS,hDll,dwError,systemLocale,(PTSTR)hlocal,0,NULL);
			FreeLibrary(hDll);
		}
	}
	if (bOK&&(hlocal))
	{
		lstrcpy(szErrorStr,(PCSTR)LocalLock(hlocal));
		LocalFree(hlocal);
	}
	else
	{
		lstrcpy(szErrorStr,"未知的错误");
	}
}