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