【发布时间】: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()。不要猜测。