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

4

[免责声明:据我所知,这是一个仅适用于Windows 7的问题]

我有一段代码可以更改Windows注册表中的代理服务器设置,然后使用以下WinInet API:

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

在Windows XP和Vista中,这是完全正常的。然而,在Windows 7中,似乎有些变化,之前的注册表键被注入回来,导致它不能像预期的那样工作。
如果我注释掉这两行代码,注册表值会保留,但显然IE和其他依赖于代理信息的应用程序并不知道配置已经改变。
有没有更好的方法来通知系统选项已经改变,并需要重新加载?我已经搜索了几天这个问题,切换了编译器等等,但无论我做什么,在Windows 7中都不能按照我的预期工作。
2个回答

6

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

3
Bingo-- 直接操作注册表是不受支持的。一个要点:为了正常运行,您应该设置INTERNET_OPTION_PROXY_SETTINGS_CHANGED选项而不是INTERNET_OPTION_REFRESH。即使您有固定代理服务器(例如使用proxyType | = PROXY_TYPE_PROXY),您也应该将PROXY_TYPE_DIRECT添加到OR中--您的注释“禁用任何代理服务器”是错误的。 您可能也不应该盲目清除绕过列表... - EricLaw
1
MSDN关于“设置和检索Internet选项”的文章:http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa385384(v=vs.85).aspx,以及一些旧的KB文章:http://support.microsoft.com/kb/226473/en-us。 - jave.web
1
我添加了像Option[2].Value.pszValue = (LPWSTR)L"xx.xx.xx.xx"这样的proxyOverride设置;然而,直到我像@EricLaw所写的那样编写了"proxyType |= PROXY_TYPE_PROXY;",它才起作用。然后,proxyOverrides开始正常工作,并且代理开始忽略"xx.xx.xx.xx" IP地址,而无需重新启动IE。谢谢大家! - Artem Zh.

0

虽然信息不是很充分,但如果您还没有这样做,您可能想尝试在HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER中设置键。

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


我之前尝试过,但结果仍然相同。你所说的“没有太多信息可供参考”,是在暗示我应该提供更多细节吗?除了可能提供一个复制/粘贴的样本脚本之外,我真的想不出还有什么可以提供的了。 - Michael
1
WinINET将使用HKCU中的设置,除非您有一个指定应使用机器设置(HKLM)的组策略。这是非常罕见的。 - EricLaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接