C++ C++/WinInet更改代理设置Windows 7

C++ C++/WinInet更改代理设置Windows 7,c++,wininet,C++,Wininet,[免责声明:据我所知,这是Windows 7特有的问题] 我有一段代码更改Windows注册表中的代理设置,然后继续使用以下命令调用WinInet API: InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0); 这在XP和Vista中是完全正确的,但是在Windows7中,某些东西显然发生了变化

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

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

InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
这在XP和Vista中是完全正确的,但是在Windows7中,某些东西显然发生了变化,并且由于某些原因,以前的注册表项被注入,导致它无法按预期工作

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


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

没有太多信息可供参考,但如果您还没有这样做,您可能想尝试在HKEY_LOCAL_机器和HKEY_CURRENT_用户中设置密钥


如果您仅在HKEY_CURRENT_USER中设置它,则可能是从HKEY_LOCAL_计算机复制并覆盖了它。

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);

我不久前试过了,结果还是一样的。“没有多少信息可供参考”,你是在暗示我应该提供更多细节吗?除了复制/粘贴示例脚本之外,我实在想不出还有什么可以提供的?WinINET将使用HKCU的设置,除非您有一个组策略指定应使用机器设置(HKLM)。这是非常罕见的。宾果-直接戳注册表是不受支持的。一点:您应该设置INTERNET\u选项\u代理\u设置\u更改选项,而不是INTERNET\u选项\u刷新,以便正常工作。即使您有固定的代理服务器(例如,使用proxyType |=PROXY |=PROXY(代理类型)代理,而不是您现有的代理服务器),您也应该使用proxyType或PROXY(代理类型)直接插入--您的注释“禁用任何代理服务器”是错误的。您可能也不应该像那样盲目地清除绕过列表…MSDN关于“设置和检索Internet选项”:和一些旧的KB:I添加了proxyOverride设置,如选项[2]。Value.pszValue=(LPWSTR)L“xx.xx.xx.xx”;然而,直到我像@EricLaw所写的那样写下“proxyType |=PROXY | TYPE(PROXY)PROXY;”它才起作用。然后proxyOverrides开始正常工作,代理开始忽略“xx.xx.xx.xx”ip地址,而不重新启动IE。谢谢大家!