首页 > 解决方案 > 格式消息不起作用

问题描述

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);
}

有没有人有任何想法?

标签: cwinapi

解决方案


根据 WinInet 的文档:

处理错误

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

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

系统错误代码 (12000-15999)

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

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

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

ERROR_WINHTTP_TIMEOUT

12002

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

以及WinInet 错误代码

ERROR_INTERNET_TIMEOUT

12002

请求已超时。

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


推荐阅读