2009-11-23 4 views
4

[면책 조항 :이 지금까지 내가 말할 수있는 윈도우 7 특정 문제입니다]C++/WinInet을 변경 프록시 설정 윈도우 7

내가 Windows 레지스트리에 프록시 설정을 변경하는 코드 블록을 가지고, 다음과 WinInet이 API를 호출 진행 :

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

이 그러나 분명히 변경 윈도우 7 일에, XP 및 Vista에서 완전히 잘하고, 어떤 이유로 이전의 레지스트리 키는 원인에 다시 주입받을 예상대로 작동하지 않습니다.

두 줄의 코드를 주석으로 처리하면 레지스트리 값이 달라질 수 있지만 분명히 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

빙고 - 레지스트리에서 직접 파고가 지원되지 않습니다. 원 포인트 : 제대로 작동하려면 INTERNET_OPTION_REFRESH 대신 INTERNET_OPTION_PROXY_SETTINGS_CHANGED 옵션을 설정해야합니다. 프록시 서버가 고정되어 있어도 (예 : proxyType | = PROXY_TYPE_PROXY 대신 사용) 프록시 서버를 사용할 때도 PROXY_TYPE_DIRECT를 OR해야합니다. '모든 프록시 서버를 사용할 수 없습니다.'라는 잘못된 내용입니다. 당신은 또한 아마도 맹목적으로 그 우회 목록을 지우지 말았어야 ... – EricLaw

+1

"설정 및 인터넷 옵션"검색에 대한 MSDN : http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384(v= vs.85) .aspx 및 일부 이전 KB : http://support.microsoft.com/kb/226473/en-us –

0

많은 정보는 없지만 설정하려고 할 수 있습니다 HKEY_LOCAL_MACHINE 및 HKEY_CURRENT_USER의 키를 아직 작성하지 않은 경우.

HKEY_CURRENT_USER에서만 설정하는 경우 HKEY_LOCAL_MACHINE에서 복사되어 덮어 쓸 수 있습니다.

+0

나는 그 전에 잠깐 노력했지만 여전히 같은 결과를 얻었습니다. "별로 갈 길이 멀지 않은"정보를 통해 더 자세한 정보를 제공해야한다는 뜻입니까? 어쩌면 복사/붙여 넣기 샘플 스크립트 외에도 제공 할 다른 것을 생각할 수 없습니까? – Michael

+1

WinINET은 컴퓨터 설정 (HKLM)을 사용해야한다는 그룹 정책이없는 한 HKCU의 설정을 사용합니다. 아주 드물다. – EricLaw