171 views
首页 > 技术心得 > 更改 IE 代理服务器的设置

更改 IE 代理服务器的设置

2010年7月22日

可以通过 ie 浏览器的主界面的菜单设置, “工具 -> Internet 选项 -> 连接 -> 局域网设置” 的 “代理服务器” 选项设置.

在 windows 下可以通过直接改以下注册表的方式更改代理设置, 但 IE 进程必须重启, 不是很专业.

Regedit4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MigrateProxy"=dword:00000001
"ProxyEnable"=dword:00000001
"ProxyHttp1.1"=dword:00000000
"ProxyServer"="http://ProxyServername:80"
"ProxyOverride"="<local>"

更好的方法是采用 InternetSetOption 函数实时改设置, 并马上对系统全局所有进程生效.

#include <wininet.h>
#pragma comment(lib, "wininet")

typedef struct PROXY_SETTINGS_DATA
{
	DWORD nFlags;
	TCHAR szProxy[MAX_PATH];
} PROXY_SETTINGS_DATA;

void _GetProxyInfo(PROXY_SETTINGS_DATA * pSettings)
{
	INTERNET_PER_CONN_OPTION_LIST    List = { 0 };
	INTERNET_PER_CONN_OPTION         Option[5] = { 0 };
	unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

	Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
	Option[1].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
	Option[2].dwOption = INTERNET_PER_CONN_FLAGS;
	Option[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
	Option[4].dwOption = INTERNET_PER_CONN_PROXY_SERVER;

	List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
	List.pszConnection = NULL;
	List.dwOptionCount = 5;
	List.dwOptionError = 0;
	List.pOptions = Option;

	if(!InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
		printf("InternetQueryOption failed! (%d)\n", GetLastError());
	if(Option[0].Value.pszValue != NULL)
		printf("%s\n", Option[0].Value.pszValue);

	if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) == PROXY_TYPE_AUTO_PROXY_URL)
		printf("PROXY_TYPE_AUTO_PROXY_URL\n");

	if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_DETECT) == PROXY_TYPE_AUTO_DETECT)
		printf("PROXY_TYPE_AUTO_DETECT\n");

	INTERNET_VERSION_INFO      Version = { 0 };
	nSize = sizeof(INTERNET_VERSION_INFO);

	InternetQueryOption(NULL, INTERNET_OPTION_VERSION, &Version, &nSize);

	pSettings->nFlags = Option[2].Value.dwValue;
	lstrcpyn(pSettings->szProxy, Option[4].Value.pszValue, MAX_PATH);

	if(Option[0].Value.pszValue != NULL)
		GlobalFree(Option[0].Value.pszValue);

	if(Option[3].Value.pszValue != NULL)
		GlobalFree(Option[3].Value.pszValue);

	if(Option[4].Value.pszValue != NULL)
		GlobalFree(Option[4].Value.pszValue);
}

int _SetProxyInfo(PROXY_SETTINGS_DATA * pSettings)
{
	// To include server for FTP, HTTPS, and so on, use the string
	// (ftp=http://<ProxyServerName>:80; https=https://<ProxyServerName>:80)
	INTERNET_PER_CONN_OPTION_LIST    List;
	INTERNET_PER_CONN_OPTION         Option[3];
	unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); 

	Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
	Option[0].Value.pszValue = pSettings->szProxy; 

	Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
	Option[1].Value.dwValue = pSettings->nFlags;
	// This option sets all the possible connection types for the client.
	// This case specifies that the proxy can be used or direct connection is possible.

	Option[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
	Option[2].Value.pszValue = "<local>"; 

	List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
	List.pszConnection = NULL;
	List.dwOptionCount = 3;
	List.dwOptionError = 0;
	List.pOptions = Option; 

	if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
		printf("InternetSetOption failed! (%d)\n", GetLastError()); 

	InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL,NULL);
	//The connection settings for other instances of Internet Explorer. 

	return 0;
}

使用时, 先调用 _GetProxyInfo 函数将原始的设置取出, 保存起来; 再用 _SetProxyInfo 设置新的代理参数; 当不用自己的代理时, 将旧的设置参数写回去.

		PROXY_SETTINGS_DATA stOrigin = { 0 };

		PROXY_SETTINGS_DATA stNew = {
			PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT,
			_T("http://ProxyServername:80"),
		};

		_GetProxyInfo(&stOrigin);
		_SetProxyInfo(&stNew);

		// ...
		// other code
		// ...

		_SetProxyInfo(&stOrigin);

free2000fly 技术心得

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.