C++/WinInet Промяна на настройките на прокси Windows 7

[Отказ от отговорност: това е специфичен проблем за 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.


person Michael    schedule 23.11.2009    source източник


Отговори (2)


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);
person Michael    schedule 22.02.2010
comment
Бинго-- директното бъркане в регистъра не се поддържа. Една точка: трябва да зададете опцията INTERNET_OPTION_PROXY_SETTINGS_CHANGED вместо INTERNET_OPTION_REFRESH за правилното функциониране. Трябва също да използвате ИЛИ PROXY_TYPE_DIRECT, дори когато имате фиксиран прокси сървър (напр. използвайте proxyType |= PROXY_TYPE_PROXY вместо това, което имате) - коментарът ви, който деактивира всеки прокси сървър, е грешен. Вероятно също така не трябва да изчиствате сляпо списъка за заобикаляне по този начин... - person EricLaw; 22.02.2010
comment
MSDN за настройка и извличане на интернет опции: msdn.microsoft.com/en-us/library/windows/desktop/ и някои стари KB: support.microsoft.com/kb/226473/en-us - person jave.web; 27.11.2014
comment
Добавих настройки на proxyOverride като Option[2].Value.pszValue = (LPWSTR)Lxx.xx.xx.xx; Въпреки това не работи, докато не написах proxyType |= PROXY_TYPE_PROXY; както @EricLaw написа. Тогава proxyOverrides започна да работи правилно и проксито започна да игнорира ip адреса xx.xx.xx.xx, без да рестартира IE. Благодаря момчета! - person Artem Zh.; 10.10.2018

Няма много информация, но може да опитате да зададете ключовете както в HKEY_LOCAL_MACHINE, така и в HKEY_CURRENT_USER, ако все още не сте го направили.

Ако го настройвате само в HKEY_CURRENT_USER, възможно е той да е копиран от HKEY_LOCAL_MACHINE и презаписан.

person Collin Dauphinee    schedule 23.11.2009
comment
Опитах го преди малко и все пак излязох със същите резултати. Като нямате много информация, намеквате ли, че трябва да предоставя повече подробности? Наистина не мога да се сетя какво друго да предоставя, освен може би примерен скрипт за копиране/поставяне? - person Michael; 23.11.2009
comment
WinINET ще използва настройките от HKCU, освен ако нямате групова политика, указваща, че трябва да се използват настройките на машината (HKLM). Това е много рядко. - person EricLaw; 22.02.2010