首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么WinAPI FormatMessage失败,总是返回false

为什么WinAPI FormatMessage失败,总是返回false
EN

Stack Overflow用户
提问于 2013-11-14 13:59:19
回答 2查看 849关注 0票数 1

我试图从FormatMessage方法中获得错误消息,但是该方法总是返回false,而lpBuffer为null。

我想知道我做错了什么?

Thx

代码语言:javascript
复制
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) + " ]");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-14 14:10:50

你说错了。如果您传递FORMAT_MESSAGE_ALLOCATE_BUFFER,您必须给它存储缓冲区的位置,因此“您必须转换指向LPTSTR的指针(例如,(LPTSTR)&lpBuffer)”。

即:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-11-14 14:10:06

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19979625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档