如何以编程方式查询和设置在 Internet Explorer 下的代理设置

文章翻译 文章翻译
文章编号: 226473 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

文章解释了该步骤必需以编程方式查询和设置的 Internet Explorer 的代理设置信息。

在 Internet Explorer 4.x 版以及更早版本,InternetSetOption 和 InternetQueryOption api 用于 INTERNET_OPTION_PROXY 标志。 尽管此选项仍能在 Internet 浏览器 5,多个连接选项已介绍新版本中。给定此,INTERNET_OPTION_PROXY 标志将返回仅"静态"代理服务器设置。静态选项是代理服务器信息存储在注册表配置单元下很多相同的方式是在 Internet 浏览器 4.0 下

注意INTERNET_OPTION_PROXY 不会永久地更改该设置。这一点对于当前进程仅当使用 NULL 句柄时。但是,它如果也可以更改在每会话基础上的设置 (使用 InternetOpen() API 获得句柄的会话) 以发送有效的会话句柄。

如果在 Internet 浏览器 5 下, 作为默认值指定一个不同的连接选项 (如拨号连接),它可能使用该 INTERNET_OPTION_PROXY 获取该代理信息标记可能不正确为当前的 Internet Explorer 会话。 因此在 Internet 浏览器 5 下, 建议在 INTERNET_OPTION_PER_CONNECTION_OPTION 使用的相反。

注意INTERNET_OPTION_PER_CONNECTION_OPTION 使设置使用 NULL 句柄时,在整个系统的基础上进行更改。若要正确反映全局代理设置,您必须调用 InternetSetOption 函数与 INTERNET_OPTION_REFRESH 选项标志。也可以在每会话基础上设置,使用有效的会话句柄。

注意就仍可以更改代理服务器为 whgke 的进程的信息,而不会影响在 Internet 浏览器 5 及更高版本的全局计算机设置。若要执行此操作必须使用 INTERNET_OPTION_PER_CONNECTION_OPTION 选项由 InternetOpen 函数返回的句柄上调用 InternetSetOption 函数。下面的代码示例将更改整个进程的代理,即使 hInternet 句柄已关闭,并且不能用于实际的请求。
HINTERNET hInternet = InternetOpen(szAppName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, ...);
InternetCloseHandle (hInternet);

更多信息

在 Internet Explorer 4.x 下一种典型的查询代理信息的机制将如下所示:
unsigned long        nSize = 4096;
char                 szBuf[4096] = { 0 };
INTERNET_PROXY_INFO* pInfo = (INTERNET_PROXY_INFO*)szBuf;

if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &nSize))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());
				
建议使用的方法是使用类似于下面的代码在 Internet 浏览器 5 下,:
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[5];
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;
nSize = sizeof(INTERNET_VERSION_INFO);

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

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);
				
上面的代码通过 INTERNET_PER_CONN_OPTION_LIST 结构中设置 pszConnection 字符串指定连接。通过设置该字符串为空,将检索配置信息的默认值 (或 LAN) 设置。

第一个选项 (选项 [0] INTERNET_PER_CONN_AUTOCONFIG_URL) 将返回指定的自动配置代理服务器的 URL。 第二个选项 (选项 [1] INTERNET_PER_CONN_AUTODISCOVERY_FLAG) 将检测是否自动检测选项处于启用状态或不是指定的连接。 第三个选项将确定哪些标志的组合已设置为该特定连接。 检索的 whe INTERNET_OPTION_PROXY 所用在 Internet Explorer 4.x 版中,最后两个选项对应于相同的信息。

您还看到使用 GlobalFree() 释放可以潜在地返回的字符串值的选项。 这是因为为您分配的字符串缓冲区,由 WININET 库和程序员释放之后使用它的缓冲区的最多。

要获得其他连接信息,只需更改为指向您拨号设置项在 List.pszConnection 字符串被希望它。

同样,将代理信息可以使用相同的技术,但与 InternetSetOption() 相反,例如:
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_PROXY_SERVER;
Option[0].Value.pszValue = "http://myproxy:8080";

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))
   printf("InternetQueryOption failed! (%d)\n", GetLastError());

				
上面的示例将在一次再次,更改默认值 (或 LAN) 设置 (List.pszConnection = = NULL)。在示例"静态"代理服务器信息更改为 http://myproxy 端口 8080。 同样您还可以更改自动配置 URL:
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[2];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[0].Value.pszValue = "http://myserver/get_proxy_info.dll";
Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
Option[1].Value.dwValue = PROXY_TYPE_AUTO_PROXY_URL;

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("InternetQueryOption failed! (%d)\n", GetLastError());
				
时配置使用 HTTP 代理服务器并转直接对其他协议的 Internet Explorer,使用代码来执行。

注意传递给 INTERNET_PER_CONN_PROXY_SERVER 缓冲区都有每个协议 (此代码设置唯一的 HTTP 和所有其他协议使用直接连接) 的设置。

注意在 INTERNET_PER_CONN_FLAGS 设置值对于这两种代理类型 (直接和通过代理服务器) 中一个元素的选项列表阵列中,如下所示在代码中。

注意您必须或者这些标志中一个位置。如果将这些标志放在另一个列表元素,它们将正确显示 (Internet 浏览器选项) 但只能有一个标志 (该设置的第一个) 将正常工作。
int main(int argc, char * argv[]) 
{ 
char buff[256] = "http=http://<ProxyServerName>:80"; 
// 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 = buff; 

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 = "<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; 

}
				
在 (再次默认值或 LAN 设置) 的示例中,您必须指定自动代理配置 URL 和设置以启用自动代理配置选项标志。

参考

MSDN WinInet API 文档,1999 年四月

属性

文章编号: 226473 - 最后修改: 2007年4月10日 - 修订: 4.0
这篇文章中的信息适用于:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 5.0
  • Microsoft Windows Internet Services (WinInet)
关键字:?
kbmt kbhowto KB226473 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 226473
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com