【问题标题】:C++/WinInet Change Proxy Settings Windows 7C++/WinInet 更改代理设置 Windows 7
【发布时间】:2010-12-19 09:24:09
【问题描述】:

[免责声明:据我所知,这是 Windows 7 特有的问题]

我有一段代码可以更改 Windows 注册表中的代理设置,然后继续使用以下内容调用 WinInet API:

InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);

这在 XP 和 Vista 中完全没问题,但在 Windows 7 中显然发生了一些变化,并且由于某种原因,以前的注册表项被重新注入,导致它无法按预期工作。

如果我注释掉这两行代码,注册表值会保持不变,但显然 IE 和其他依赖该代理信息的应用程序不知道配置已更改。

有没有更好的方法来通知系统选项已更改并需要重新加载?我已经在这个问题上搜索了几天,切换了编译器等,但我没有做任何事情让它像我在 Windows 7 中所期望的那样工作。

【问题讨论】:

    标签: c++ wininet


    【解决方案1】:

    没有太多信息可供参考,但如果您还没有这样做,您可能想尝试设置 HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 中的键。

    如果您只在 HKEY_CURRENT_USER 中设置它,它可能会被从 HKEY_LOCAL_MACHINE 复制并覆盖。

    【讨论】:

    • 我前一阵试过了,结果还是一样。通过“没有太多信息可以参考”,您是否暗示我应该提供更多细节?除了复制/粘贴示例脚本之外,我真的想不出其他可以提供的东西了?
    • WinINET 将使用来自 HKCU 的设置,除非您有一个组策略指定应使用机器设置 (HKLM)。这非常罕见。
    【解决方案2】:

    FWIW 我最初的问题是没有使用整个 WinInet API 来处理代理设置。答案从一开始就一直盯着我……最终的解决方案可能类似于:

    LPWSTR proxyName;
    
    if (on) {
        proxyName = L"http=[IPADDRESS:PORT];https=[IPADDRESS:PORT]";
    } else {
        proxyName = 0;
    }
    
    INTERNET_PER_CONN_OPTION_LIST OptionList;
    INTERNET_PER_CONN_OPTION Option[3];
    unsigned long listSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
    Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
    Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
    Option[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
    OptionList.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
    OptionList.pszConnection = NULL;
    OptionList.dwOptionCount = 3;
    OptionList.dwOptionError = 0;
    
    DWORD proxyType = PROXY_TYPE_DIRECT; // this proxy type disables any proxy server
    
    if (proxyName) {
        if (proxyName[0]) {
            proxyType = PROXY_TYPE_PROXY; // a name has been passed, so choose the correct proxy type for enabling the proxy server
        }
    }
    
    Option[0].Value.pszValue = (LPWSTR)proxyName;
    Option[1].Value.dwValue = proxyType;
        if (on) {
                Option[2].Value.pszValue = (LPWSTR)L"";
        } else {
                Option[2].Value.pszValue = (LPWSTR)L"";
        }
    OptionList.pOptions = Option;
    
        if (!InternetSetOption(0, INTERNET_OPTION_PER_CONNECTION_OPTION, &OptionList, listSize)) {
                // handle error
        }
    
    InternetSetOption(0, INTERNET_OPTION_REFRESH, NULL, NULL);
    

    【讨论】:

    • Bingo -- 不支持直接戳注册表。一点:您应该设置 INTERNET_OPTION_PROXY_SETTINGS_CHANGED 选项而不是 INTERNET_OPTION_REFRESH 才能正常运行。即使您有固定的代理服务器(例如,使用 proxyType |= PROXY_TYPE_PROXY 而不是您所拥有的),您也应该对 PROXY_TYPE_DIRECT 进行 OR 操作——您的评论“禁用任何代理服务器”是错误的。你可能也不应该像那样盲目地清除绕过列表......
    • MSDN 关于“设置和检索 Internet 选项”:msdn.microsoft.com/en-us/library/windows/desktop/… 和一些旧知识库:support.microsoft.com/kb/226473/en-us
    • 我添加了 proxyOverride 设置,例如 Option[2].Value.pszValue = (LPWSTR)L"xx.xx.xx.xx";但是,直到我写了“proxyType |= PROXY_TYPE_PROXY;”,它才起作用。正如@EricLaw 所写。然后 proxyOverrides 开始正常工作,代理开始忽略“xx.xx.xx.xx” ip 地址,无需重新启动 IE。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多