// TODO
class CSetIEProxy
{
public:
CSetIEProxy()
{
}
virtual ~CSetIEProxy()
{
}
public:
//
// 设置代理
//
BOOL SetProxy(CString strProxyServer)
{
if (SetProxyOption(strProxyServer) && EnableConnetByLan())
{
return TRUE;
}
return FALSE;
}
//
// 取消代理
//
BOOL CanCelProxy()
{
if (DisableConnectionProxy() && DisableConnetByLan())
{
return TRUE;
}
return FALSE;
}
//
// 得到代理(此函数功能有待开发)
//
void GetProxy()
{
GetProxyOption();
}
protected:
//
// 设置Internet代理连接选项
//
BOOL SetProxyOption(CString strProxyServer)
{
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 = (LPTSTR)(LPCTSTR)strProxyServer;
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 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 = _T("<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))
{
return FALSE;
}
Update();
return TRUE;
}
//
// 得到Internet代理连接选项
//
void GetProxyOption()
{
INTERNET_PER_CONN_OPTION_LIST iOptionList; //Internet连接选项
INTERNET_PER_CONN_OPTION iOptions[3];
ULONG uSize = sizeof(iOptionList);
iOptionList.dwSize = uSize;
iOptionList.pszConnection = NULL;
iOptionList.dwOptionCount = 3;
iOptionList.pOptions = iOptions;
// set proxy type direct or proxy server
iOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
iOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
iOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
if(InternetQueryOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION ,(LPVOID)(&iOptionList),&uSize))
{
GlobalFree(iOptionList.pOptions[1].Value.pszValue);
GlobalFree(iOptionList.pOptions[2].Value.pszValue);
GlobalFree(iOptionList.pOptions[3].Value.pszValue);
}
}
//
// 取消IE代理设置
//
BOOL DisableConnectionProxy()
{
INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[1];
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_FLAGS;
Option[0].Value.dwValue = PROXY_TYPE_DIRECT;
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 1;
List.dwOptionError = 0;
List.pOptions = Option;
if (!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
{
return FALSE;
}
Update();
return TRUE;
}
// 使代理可用
//
// 修改IE拨号选项,改为不拨号
//
BOOL EnableConnetByLan()
{
HKEY hKey = OpenRegister();
if (NULL == hKey)
{
return FALSE;
}
DWORD dw = FALSE;
if (ERROR_SUCCESS != RegSetValueEx(hKey, // subkey handle
_T("EnableAutodial"), // value name
0, // must be zero
REG_DWORD, // value type
(LPBYTE)&dw, // pointer to value data
sizeof(dw)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
Update();
return TRUE;
}
// 使代理不可用
//
// 修改IE拨号选项,改为拨号
//
BOOL DisableConnetByLan()
{
HKEY hKey = OpenRegister();
if (NULL == hKey)
{
return FALSE;
}
DWORD dw = TRUE;
if (ERROR_SUCCESS != RegSetValueEx(hKey, // subkey handle
_T("EnableAutodial"), // value name
0, // must be zero
REG_DWORD, // value type
(LPBYTE)&dw, // pointer to value data
sizeof(dw)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
Update();
return TRUE;
}
// 打开注册表项
HKEY CSetIEProxy::OpenRegister()
{
HKEY hKey;
DWORD dwDisp;
long lResult = 0;
lResult = RegCreateKeyEx(HKEY_CURRENT_USER,
_T("Software//Microsoft//Windows//CurrentVersion//Internet Settings"),
0,
_T(""),
0,
0,
NULL,
&hKey,
&dwDisp);
if (ERROR_SUCCESS != lResult)
{
hKey = NULL;
}
return hKey;
}
// 更新代理
void CSetIEProxy::Update()
{
//通知:注册表中代理改变,下次连接时启动代理
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
//从注册表中读入代理
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
}
};
如果需要枚举拨号连接,可以使用 RasEnumConnections
// 详细的请见 BLOG.CSND.NET/HAPPYHELL