1

我试图从 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) + " ]");
}
4

2 回答 2

3

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

IE:

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

请参阅此处的文档:

于 2013-11-14T14:10:50.403 回答
0

你必须传递&lpBufferFormatMessage,而不是lpBuffer

于 2013-11-14T14:10:06.207 回答