2009-11-23 3 views
4

[Avertissement: ceci est un problème spécifique de Windows 7 pour autant que je peux dire]C++/WinInet Modification des paramètres proxy Windows 7

J'ai un bloc de code qui modifie les paramètres de proxy dans le Registre Windows, procède ensuite à appeler l'API WinInet ce qui suit:

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

Ceci est tout à fait bien dans XP et Vista, mais dans quelque chose de Windows 7 a apparemment changé, et pour une raison quelconque les clés de registre précédentes se réinjecté en le faisant ne pas fonctionner comme prévu. Si je commente ces deux lignes de code, les valeurs de registre s'en tiennent, mais évidemment IE et d'autres applications s'appuyant sur ces informations de proxy n'ont aucune idée que la configuration a changé.

Y a-t-il une meilleure façon de gérer la notification au système que les options ont changé et doivent être rechargées? J'ai cherché pendant des jours sur ce problème, les compilateurs commutés, etc., et rien de ce que je fais ne fonctionne comme je le ferais dans Windows 7.

Répondre

5

La réponse m'a regardé dans le visage depuis le début ... Une solution finale pourrait ressembler à quelque chose comme:

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-- piquer directement sur le registre n'est pas supporté. Un point: Vous devez définir l'option INTERNET_OPTION_PROXY_SETTINGS_CHANGED au lieu de INTERNET_OPTION_REFRESH pour un fonctionnement correct. Vous devez également OU PROXY_TYPE_DIRECT même si vous avez un serveur proxy fixe (par exemple, utilisez proxyType | = PROXY_TYPE_PROXY au lieu de ce que vous avez) - votre commentaire "désactive tout serveur proxy" est incorrect. Vous ne devriez probablement pas effacer aveuglément la liste de contournement comme ça ... – EricLaw

+1

MSDN sur "Définition et récupération des options Internet": http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384(v= vs.85) .aspx et quelques anciens KB: http://support.microsoft.com/kb/226473/fr –

0

Il n'y a pas beaucoup d'informations à passer, mais vous voudrez peut-être essayer de définir les clés dans HKEY_LOCAL_MACHINE et HKEY_CURRENT_USER si vous ne le faites pas déjà.

Si vous le définissez uniquement dans HKEY_CURRENT_USER, il est possible qu'il soit copié à partir de HKEY_LOCAL_MACHINE et qu'il soit remplacé. FWIW mon problème original n'utilisait pas l'API WinInet entière pour gérer les paramètres de proxy.

+0

J'ai essayé cela il y a un certain temps, et je suis sorti avec les mêmes résultats. Par "pas beaucoup d'informations à passer" êtes-vous en train de suggérer que je devrais fournir plus de détails? Je ne peux pas vraiment penser à autre chose à fournir, en plus peut-être un exemple de copier/coller un script? – Michael

+1

WinINET utilisera les paramètres de HKCU sauf si vous avez une stratégie de groupe spécifiant que les paramètres de la machine (HKLM) doivent être utilisés. C'est très rare. – EricLaw

Questions connexes