为啥 WinAPI FormatMessage 失败,总是返回 false

Posted

技术标签:

【中文标题】为啥 WinAPI FormatMessage 失败,总是返回 false【英文标题】:Why WinAPI FormatMessage fails, always returns false为什么 WinAPI FormatMessage 失败,总是返回 false 【发布时间】: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 返回的值是多少? 可能重复***.com/q/2159458/395718 @Dialectus:此代码来自该问题的解决方案。不是骗子。 【参考方案1】:

你说错了。如果您传递FORMAT_MESSAGE_ALLOCATE_BUFFER,则必须为其提供存储缓冲区的位置,因此“您必须将指针转换为 LPTSTR(例如,(LPTSTR)&amp;lpBuffer)。”

即:

nResult = FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE,
    GetModuleHandle("wininet.dll"), 
    dwError, 
    0, 
    (LPTSTR)&lpBuffer, 
    BUFFER_SIZE, 
    NULL
);

在此处查看文档:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx

【讨论】:

【参考方案2】:

您必须将&amp;lpBuffer 传递给FormatMessage,而不是lpBuffer

【讨论】:

以上是关于为啥 WinAPI FormatMessage 失败,总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

为啥尝试绕行winapi时进程崩溃?

为啥我使用 WinAPI C++ 录制的声音无法正常播放?

是否可以覆盖一个特定 intl.formatMessage 的语言环境?

我应该如何在 C++ 中正确使用 FormatMessage()?

带有占位符的 FormatMessage

如何在 intl.formatMessage 中使用占位符