2009-11-23 71 views
4

[免責聲明:這是Windows 7的具體問題,據我可以告訴]C++/WinInet的更改代理設置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中工作正常。

回答

5

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

Bingo--直接在註冊表中戳動不受支持。 一點:您應該設置INTERNET_OPTION_PROXY_SETTINGS_CHANGED選項而不是INTERNET_OPTION_REFRESH才能正常工作。 即使您有固定的代理服務器(例如,使用proxyType | = PROXY_TYPE_PROXY而不是您所擁有的),您也應該使用OR PROXY_TYPE_DIRECT - 您的評論「禁用任何代理服務器」是錯誤的。您也可能不應該盲目地清除旁路列表... – EricLaw 2010-02-22 02:19:26

+1

有關「設置和檢索Internet選項」的MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384 (v= vs.85).aspx和一些舊的KB:http://support.microsoft.com/kb/226473/en-us – 2014-11-27 16:16:56

0

沒有太多的信息可以通過,但您可能想嘗試設置如果您尚未這樣做,則HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER中的鍵。

如果您只是在HKEY_CURRENT_USER中設置它,則可能是從HKEY_LOCAL_MACHINE中複製並覆蓋它。

+0

我試過一段時間了,仍然出來了相同的結果。通過「沒有太多的信息去」你是否暗示我應該提供更多的細節?除了可能有複製/粘貼示例腳本之外,我無法提供其他許多東西嗎? – Michael 2009-11-23 16:04:56

+1

WinINET將使用HKCU的設置,除非您有組策略指定應使用機器設置(HKLM)。這非常罕見。 – EricLaw 2010-02-22 02:20:12