当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++/WinInet更改代理设置Windows7》经验,为你挑选了1个好方法。

[免责声明:据我所知,这是一个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中运行.



1> Michael..:

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而不是你所拥有的),你也应该OR PROXY_TYPE_DIRECT - 你的评论"禁用任何代理服务器"是错误的.你也许不应该盲目地清除这样的旁路列表......
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有