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);
}
有没有人有任何想法?
解决方案
根据 WinInet 的文档:
要获取错误的错误文本,请调用该
FormatMessage
函数,将其传递给 的HMODULE
句柄Wininet.dll
,该句柄可以使用该GetModuleHandle
函数获得。
这与微软的系统文档相反:
以下列表描述了系统错误代码(错误 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
.
推荐阅读
- ruby-on-rails - 向模型添加验证
- php - Laravel - 基于单独的表行创建创建动态前缀的数据库表
- flutter - 我正在尝试使用带有颤振的云 Firestore,但我遇到了错误
- eclipse - 有没有办法运行一个 mvn 站点来为从 Tycho maven 创建的依赖项生成报告?
- flutter - 任务':auto_orientation:verifyReleaseResources'的Flutter Android构建失败
- java - 如何获取属性在camelCase中但我有应用程序级属性命名策略的RequestBody:springboot中的SNAKE_CASE
- html - 为什么我的电子邮件签名中的嵌入图像在 Windows 上的 Outlook 中不符合其宽度样式?
- forms - 如何从 react-native web 表单更新状态?
- sql - 如何使用“in”运算符返回 0 而不是 null
- mongodb - Mongo URI 问题 - SSL 对等证书验证失败:自签名证书