【问题标题】:FormatMessage doesn't work格式消息不起作用
【发布时间】:2018-08-08 13:07:45
【问题描述】:

FormatMessage() 无论我做什么都对我不起作用。当我遇到错误 12002 时,lpBuffer 一直返回为 NULL。这是我的代码:

LPTSTR lpBuffer = NULL;
DWORD dwError = GetLastError();
int nResult = 0;
if (dwError >= 12000 && dwError <= 12174)
{
    nResult = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, 
        GetModuleHandle("wininet.dll"), dwError, 0, (LPTSTR)&lpBuffer, 0, NULL);
}
else
{
    nResult = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
        NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpBuffer, 0, NULL);
}

有人有什么想法吗?

【问题讨论】:

  • wininet.dll 已经加载了吗? FormatMessage 失败后的 GetLastError(); 是什么?可以假设GetModuleHandle("wininet.dll") 失败
  • FormatMessage 工作正常。这是你的代码不起作用。值得在问题标题中明确这一点。
  • 如果 GetModuleHandle("wininet.dll"); 不返回 NULL,您的代码可以工作。如果我链接到 lib 并调用 InternetOpen 它对我有用。
  • ^^ @RbMm 所说的。当遇到这样的问题时,您的第一个想法应该是通过调用 GetModuleHandle() 并加载到临时变量中来简化代码。在单独的行上,以便您可以轻松检查其结果。在一个语句中使用多个系统 API 调用可能看起来很酷,但实际上很难理解和调试:(
  • 无论如何 - 如果FormatMessage 失败 - 在此之后查看并在此处发布GetLastError()。不要猜测。

标签: c winapi


【解决方案1】:

根据 WinInet 的文档:

Handling Errors

要获取错误的错误文本,请调用FormatMessage 函数,将HMODULE 句柄传递给Wininet.dll,可以使用GetModuleHandle 函数获取该句柄。

这与微软的系统文档相反:

System Error Codes (12000-15999)

以下列表描述了系统错误代码(错误 12000 到 15999)。当许多函数失败时,它们由GetLastError 函数返回。 要检索应用程序中错误的描述文本,请使用带有 FORMAT_MESSAGE_FROM_SYSTEM 标志的 FormatMessage 函数

这在逻辑上将包括 12000-12175 范围内的 WinInet 错误代码,但实际上它仅适用于少数选定的 WinInet 错误。

另请注意,WinInet 和 WinHTTP 共享相同的 12xxx 范围的错误代码。错误代码 12002 是 WinHTTP error code:

ERROR_WINHTTP_TIMEOUT

12002

无论在 Windows HTTP 服务中设置的超时值如何,都可能由于 TCP/IP 超时行为而返回此错误。

还有WinInet error code:

ERROR_INTERNET_TIMEOUT

12002

请求已超时。

您没有指明您使用的是哪个库。确保在调用 FormatMessage() 时使用正确的模块。如果您从 WinInet 函数中收到错误,请使用 wininet.dll。如果您从 WinHTTP 函数中收到错误,请使用 winhttp.dll

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2017-02-04
    • 2017-06-10
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多