【发布时间】:2013-11-14 13:59:19
【问题描述】:
我试图从 FormatMessage 方法获取错误消息,但该方法总是返回 false 并且 lpBuffer 为空。
我想知道我做错了什么?
谢谢
LPTSTR lpBuffer = NULL;
DWORD dwError = GetLastError();
int nResult = 0;
if (dwError >= 12000 && dwError <= 12174)
{
logger.info("dwError >= 12000 && dwError <= 12174");
nResult = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, GetModuleHandle("wininet.dll"), dwError, 0, lpBuffer, 0, NULL);
}
else
{
logger.info("in else");
nResult = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),lpBuffer, 0, NULL);
}
if (nResult)
{
logger.critical("Cannot start Drools client [" + m_exe + "] because [" + lpBuffer + "]");
//wcout << (LPWSTR)lpBuffer << endl;
LocalFree(lpBuffer);
}
else
{
logger.critical("Cannot start Drools client [" + m_exe + "] because [ Windows error code : " + boost::lexical_cast<string>(dwError) + " ]");
}
【问题讨论】:
-
GetLastError() 仅适用于某些 API(调用 SetLastError() 的那个你确定是你的情况吗?
-
MSDN 谈到 FormatMessage:“如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。”是你做的吗? GetLastError 返回的值是多少?
-
@Dialectus:此代码来自该问题的解决方案。不是骗子。