【问题标题】:WinHttpSendRequest failed with error code 87WinHttpSendRequest 失败,错误代码 87
【发布时间】:2019-04-01 16:41:11
【问题描述】:

我正在尝试使用 WinHttpSendRequest 从服务器下载文件,但结果为 0,错误代码为 87 (ERROR_INVALID_PARAMETER)。

// Specify an HTTP server.
if (hSession)
        hConnect = WinHttpConnect( hSession, T2W((LPTSTR)tsDownloadServer.c_str()), wPort, 0 );
// tsDownloadServer = "xxx.xxx.xxx.xx:xxxx"

// Create an HTTP request handle.
if (hConnect)
        hRequest = WinHttpOpenRequest( hConnect, L"GET",T2W((LPTSTR)tsDownloadFileURLPath.c_str()), NULL, WINHTTP_NO_REFERER, ppwszAcceptTypes, dwOpenRequestFlag );
// tsDownloadFileURLPath = "/xxxxx/xxxxxxxx/58bbf9067ad35634c7caa5594e8ec712/windows_installer/xxxxx_xxxxxx.wak"

bResults = WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );

bResults 为 0,GetLastError() 返回 87

我在互联网上研究过相关问题是由于超过 24 字节的数据,但在我的情况下,我在参数中设置了 WINHTTP_NO_REQUEST_DATA。

如何向服务器发送请求?

【问题讨论】:

  • 忘记 WinHTTP 并使用 WinInet。
  • 您是否看到来自 WinHttpOpenRequest 的 bResults 不为 NULL?这可能是您得到 ERROR_INVALID_PARAMETER (87) 结果的原因。
  • 代码显然是在启用 Unicode 的情况下编译的,所以我的魔法水晶调试器认为 tsDownloadServertsDownloadFileURLPath 是 ANSI 字符串被错误地转换为无效的 Unicode 字符指针。如果您必须进行类型转换只是为了使代码编译,那么您可能做错了什么。

标签: windows c++11 winapi


【解决方案1】:

ERROR_INVALID_PARAMETER 表示问题出在处理程序hRequest 上,您尚未检查返回值。如果它是NULL,那可能是上次调用WinHttpOpenRequest的原因;甚至WinHttpConnect 失败,因此它不再获得hRequest

正如@Remy Lebeau 所说,这取决于您的 Unicode 设置。在禁用 Unicode 的情况下,如果 tsDownloadServertsDownloadFileURLPath 的类型为 wstring,则 (LPTSTR)tsDownloadServer.c_str() 将从宽字符转换为多字节。然后宽字符中的零(如果字符是 ASCII)被认为是终止符:

字符串被截断:

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 2013-02-19
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多