WinHttpSendRequest 失败并显示 ERROR_WINHTTP_SECURE_FAILURE

2024-02-20

以编程方式与网络进行通信不是我的专业领域,但我设法通过从网上找到的示例中剪切和粘贴代码来创建 read_web_page() 函数,并且该代码已经连续好几个月每天正常运行。

碰巧的是,我工作时的主 Windows-10 电脑坏了,在等待维修时,我现在被迫在家里的 Windows-7 电脑上运行(相同的)代码。

但现在我出现了一个我以前从未见过的错误。我调用以下代码(简化):

    // code to handle bad return values from the following three functions ommitted...

    HINTERNET hsession = WinHttpOpen(0,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS, 0);

    HINTERNET hconnect = WinHttpConnect(hsession, (LPCWSTR)thewebsite, INTERNET_DEFAULT_HTTPS_PORT , 0);

    HINTERNET hrequest = WinHttpOpenRequest(hconnect, L"GET", (LPCWSTR)thesubdirectory, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);

    if (!WinHttpSendRequest(hrequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
    {
        int err = GetLastError();

通常 WinHttpSendRequest 返回零,但现在返回非零值,并且 GetLastError() 返回值 12175(等于 ERROR_WINHTTP_SECURE_FAILURE)。

我连接的 (https) URL 始终相同,当我将其输入浏览器时,该网站仍然显示正常。

也许电脑和位置的整个变化是巧合,问题是由我正在阅读的网站的幕后变化引起的(它不在我的控制之下)......但我不知道如何开始诊断(或修复)故障。这可能与我的 ISP 有关吗?

The WinHttpSendRequest 的文档 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384110%28v=vs.85%29.aspx说可以通过设置回调函数找到此错误的更详细信息,但描述如何完成此操作的文档对我来说是无法理解的,而且我在任何地方都找不到任何示例代码。

EDIT:为了解决 Barmak 对网站和子目录的担忧,创建它们的代码如下:

char *char_thewebsite = "www.thewebsite.com";
char *char_thesubdirectory = "sub";

int n_website = MultiByteToWideChar(CP_ACP, 0, char_thewebsite, -1, NULL, 0);
int n_subdir = MultiByteToWideChar(CP_ACP, 0, char_thesubdirectory, -1, NULL, 0);

thewebsite = new WCHAR[n_website];
thesubdirectory = new WCHAR[n_subdir];

MultiByteToWideChar(CP_ACP, 0, char_thewebsite, -1, (LPWSTR)thewebsite, n_website);
MultiByteToWideChar(CP_ACP, 0, char_thesubdirectory, -1, (LPWSTR)thesubdirectory, n_subdir);

这是一个很长的评论,不是答案!

WinINet 更容易,如果不需要 WinHTTP 服务器功能,可以使用 WinINet 库。但是,您不能同时使用 WinINet 和 WinHTTP。

声明字符串时,最好从 UTF-16 字符串开始wchar_t *str = L"str"。有时你的源字符串是UTF-8,在这种情况下你可以使用MultiByteToWideChar(CP_UTF8...)转换为 UTF-16。

WinINet 示例:

#include <iostream>
#include <fstream>
#include <Windows.h>
#include <WinINet.h>

#pragma comment(lib, "WinINet.lib")

int main()
{
    const wchar_t* url = L"https://stackoverflow.com/questions";
    std::ofstream fout(L"c:\\test\\test.htm");
    HINTERNET hopen = InternetOpen(L"MyAppName",
        INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if(hopen)
    {
        DWORD flags = INTERNET_FLAG_DONT_CACHE;
        if(wcsstr(url, L"https://") == url)
            flags |= INTERNET_FLAG_SECURE;
        HINTERNET hinternet = InternetOpenUrl(hopen, url, NULL, 0, flags, 0);
        if(hinternet)
        {
            char buf[1024];
            DWORD received = 0;
            while(InternetReadFile(hinternet, buf, sizeof(buf), &received))
            {
                if(!received) break;
                fout.write(buf, received);
            }
            std::cout << "success!\n";
            InternetCloseHandle(hinternet);
        }
        InternetCloseHandle(hopen);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WinHttpSendRequest 失败并显示 ERROR_WINHTTP_SECURE_FAILURE 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐