c语言 - 格式消息不起作用



无论我做什么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);
}

有人有什么想法吗?

根据 WinNet 的文档:

处理错误

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

这与Microsoft的系统文档形成鲜明对比:

系统错误代码 (12000-15999(

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

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

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

ERROR_WINHTTP_TIMEOUT

12002

年 此错误可能会作为 TCP/IP 超时行为的结果返回,而不考虑 Windows HTTP 服务中设置的超时值。

以及WinInet错误代码:

ERROR_INTERNET_TIMEOUT

12002

请求已超时。

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

最新更新