由于在实践中遇到需要自动设置代理服务器,使得使用更方便,把对这个问题研究的一些心得写下来,别人需要也可以参考下,自己时间长了忘了也可以翻看下。
自动化地用程度设置IE代理服务器基本上可以有以下几个途径:
1. 注册表导入。
新建一个注册表文件,例如用以下为内容的注册表文件:
Regedit4
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings]
"MigrateProxy"=dword:00000001
"ProxyEnable"=dword:00000001
"ProxyHttp1.1"=dword:00000000
"ProxyServer"="http://ProxyServername:80"
"ProxyOverride"="<local>"
导入文件后,注册表将被更改,但此时IE的代理并未更改,需要将所有的IE进程关掉再启动才能生效。这也是这种办法的一个不足之处。
2. 调用InternetSetOption接口
例程如下:
#include "stdio.h"
#include "windows.h"
#include "wininet.h"
#pragma comment(lib,"wininet.lib")
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
//char buff[256] ="http=http://itgproxy:80";
char buff[256]= "10.76.1.57:1437";
int buffSize = MultiByteToWideChar(CP_ACP, 0, buff, -1, NULL,0);
LPWSTR proxy = new WCHAR[buffSize];
MultiByteToWideChar(CP_ACP, 0, buff, -1, proxy,buffSize);
INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[2];
unsignedlong nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
Option[0].Value.pszValue = proxy;
Option[1].dwOption =INTERNET_PER_CONN_FLAGS;
Option[1].Value.dwValue = PROXY_TYPE_PROXY;
Option[1].Value.dwValue |= PROXY_TYPE_DIRECT;
// This option sets all the possible connection types for theclient.
// This case specifies that the proxy can be used or directconnection 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 = 2;
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_SETTINGS_CHANGED,NULL,NULL);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH,NULL,NULL);
//The connection settings for other instances of InternetExplorer.
return 0;
}
这种方法的好处在于运行后,代理即时生效。如果在程序里增加文件读写也可以使代理的设置可配置
3.这应当说是一种混合方法,先用注册表导入,再调用
InternetSetOption(NULL,INTERNET_OPTION_SETTINGS_CHANGED,NULL,NULL);
InternetSetOption(NULL,INTERNET_OPTION_REFRESH, NULL,NULL);
这种方法看上去不是很纯洁,但也能达到即生效。而且有个好处是程序的编写变得很简单,对InternetSetOption的理解不需要多深入。
在java中调有C或C++产生出来的程序可以用Runtime.getRuntime().exec(exefile),这样就能在java中实再动态自动地设置IE的代理了。