FormatMessage不起作用

时间:2018-08-08 13:07:46

标签: c winapi

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

有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

根据WinInet的文档:

Handling Errors

  

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

与Microsoft的系统文档相反:

System Error Codes (12000-15999)

  

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

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

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

  

ERROR_WINHTTP_TIMEOUT

     

12002

     

无论Windows HTTP Services中设置了什么超时值,都可能由于TCP / IP超时行为而返回此错误。

还有WinInet error code

  

ERROR_INTERNET_TIMEOUT

     

12002

     

请求已超时。

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