设置和检索 Internet 选项
本主题介绍如何使用 InternetSetOption 和 InternetQueryOption 函数设置和检索 Internet 选项。
可以在指定的 HINTERNET 句柄或 Microsoft Internet Explorer 中的当前设置上设置 Internet 选项,也可以从中检索。
实现步骤
若要设置或检索 Internet 选项,请完成以下操作:
选择 Internet 选项
由于 Internet 选项太多,因此选择正确的选项非常重要。 许多 Internet 选项会影响 WinINet 函数和 Internet Explorer 的行为:
例如,你能够:
- 通过设置用户名和密码来处理基本的服务器和代理身份验证。
- 设置或检索服务器用于标识客户端应用程序或浏览器功能的用户代理字符串。
- 检索指定 HINTERNET 句柄的句柄类型。
有关详细信息和 Internet 选项列表,请参阅 选项标志。
在 Internet Explorer 5 及更高版本中,可以使用 INTERNET_PER_CONN_OPTION_LIST 和 INTERNET_PER_CONN_OPTION 结构从特定 Internet 连接设置或检索某些选项。 有关详细信息以及可从特定 Internet 连接设置或检索的选项列表,请参阅 INTERNET_PER_CONN_OPTION 结构的 dwOptions 成员。
选择 HINTERNET 句柄
用于设置或检索 Internet 选项的 HINTERNET 句柄确定操作的范围。 通过此句柄创建的所有句柄都将继承此句柄上设置的选项。
例如,需要具有身份验证的代理的客户端应用程序可能不需要在每次应用程序尝试访问 Internet 资源时设置代理用户名和密码。 如果给定连接上的所有请求都由同一代理处理,则设置连接类型 HINTERNET 句柄(即调用 InternetConnect 创建的句柄)上的代理用户名和密码将允许派生自此 HINTERNET 句柄的任何调用使用相同的代理用户名和密码。 每次 HttpOpenRequest 创建 HINTERNET 句柄时,设置代理用户名和密码都需要额外的不必要的开销。 请注意,如果应用程序使用需要身份验证的代理,则应在每个新连接上设置代理凭据。
设置或检索选项
确定要使用的 Internet 选项和 HINTERNET 句柄后,请检索这些 Internet 选项。 若要设置或检索选项,请调用 InternetQueryOption 或 InternetSetOption。
HINTERNET 句柄的范围
用于设置或检索 Internet 选项的 HINTERNET 句柄确定选项对其有效的操作。
这些句柄有三个级别:
- 调用 InternetOpen) 创建的根 HINTERNET 句柄 (将包含影响此 WinINet 实例的所有 Internet 选项。
- 连接到由调用 InternetConnect 创建的服务器的 HINTERNET 句柄 ()
- HINTERNET 与特定服务器上的资源或资源枚举关联的句柄。
除了各种 HINTERNET 句柄外,应用程序还可以使用 NULL 来设置或检索 Internet Explorer 和 WinINet 函数使用的 Internet 选项的默认值。 使用 NULL 作为句柄时设置 Internet 选项会更改当前存储在注册表中的选项的默认值。 客户端应用程序不应使用注册表函数更改 Internet 选项的默认值,因为将来可以更改选项存储方式的实现。
下表列出了 HINTERNET 句柄的类型以及与它们关联的 Internet 选项的范围。
句柄类型 | 范围 |
---|---|
NULL | Internet Explorer 的默认选项设置。 |
INTERNET_HANDLE_TYPE_CONNECT_FTP | 此与 FTP 服务器的连接的选项设置。 这些选项会影响从此 HINTERNET 句柄启动的任何操作,例如文件下载。 |
INTERNET_HANDLE_TYPE_CONNECT_GOPHER | 此与 Gopher 服务器的连接的选项设置。 这些选项会影响从此 HINTERNET 句柄启动的任何操作,例如文件下载。
注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_CONNECT_HTTP | 此 HTTP 服务器连接的选项设置。 这些选项会影响从此 HINTERNET 句柄启动的任何操作,例如文件下载。 |
INTERNET_HANDLE_TYPE_FILE_REQUEST | 与此文件请求关联的选项设置。 |
INTERNET_HANDLE_TYPE_FTP_FILE | 与此 FTP 资源下载关联的选项设置。 |
INTERNET_HANDLE_TYPE_FTP_FILE_HTML | 与此 FTP 资源关联的选项设置以 HTML 格式下载。 |
INTERNET_HANDLE_TYPE_FTP_FIND | 与 FTP 服务器上的此文件搜索关联的选项设置。 |
INTERNET_HANDLE_TYPE_FTP_FIND_HTML | 与 FTP 服务器上以 HTML 格式的文件的此搜索关联的选项设置。 |
INTERNET_HANDLE_TYPE_GOPHER_FILE | 与此 Gopher 资源下载关联的选项设置。
注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML | 与此 Gopher 资源下载关联的选项设置,格式为 HTML。
注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_GOPHER_FIND | 与 Gopher 服务器上文件的此搜索关联的选项设置。
注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML | 与 Gopher 服务器上以 HTML 格式设置的文件的此搜索关联的选项设置。
注意: 仅限 Windows XP 和 Windows Server 2003 R2 及更早版本。 |
INTERNET_HANDLE_TYPE_HTTP_REQUEST | 与此 HTTP 请求关联的选项设置。 |
INTERNET_HANDLE_TYPE_INTERNET | 与此 WinINet 函数实例关联的选项设置。 |
设置单个选项
确定要设置的 Internet 选项以及要受这些选项影响的范围后,设置 Internet 选项并不复杂。 只需使用所需的 HINTERNET 句柄、Internet 选项标志和包含所需设置信息的缓冲区调用 InternetSetOption 函数。
以下示例演示如何在指定的 HINTERNET 句柄上设置代理用户名和密码。
// strUsername is a string buffer of cchMax characters or less.
// It contains the proxy user name.
size_t cchMax = 80;
size_t cchUserLength, cchPasswordLength;
HRESULT hr = StringCchLength(strUsername, cchMax, &cchUserLength);
if (SUCCEEDED(hr))
{
// hOpen is the HINTERNET handle created by InternetConnect.
InternetSetOption(hConnect, INTERNET_OPTION_PROXY_USERNAME,
strUsername, DWORD(cchUserLength)+1);
}
else
{
// Insert error handling code here.
}
// strPassword is the string buffer that contains the proxy password.
hr = StringCchLength(strPassword, cchMax, &cchPasswordLength);
InternetSetOption(hOpen, INTERNET_OPTION_PROXY_PASSWORD,
strPassword, DWORD(cchPasswordLength)+1);
检索单个选项
可以使用 InternetQueryOption 函数检索 Internet 选项。 检索 Internet 选项:
确定检索 Internet 选项信息所需的缓冲区大小。
可以通过对缓冲区的地址使用 NULL 并向其传递零的缓冲区大小来确定缓冲区大小。
DWORD dwSize; InternetQueryOption(NULL, INTERNET_OPTION_USER_AGENT, NULL, &dwSize);
InternetQueryOption 返回的值是检索信息所需的内存量(以字节为单位)。
为缓冲区分配内存。
char *lpszData; lpszData = new char[dwSize];
检索数据。
InternetQueryOption( NULL, INTERNET_OPTION_USER_AGENT, lpszData, &dwSize );
释放内存。
delete [] lpszData;
完整示例
下面是上一部分使用的完整示例。 此示例演示如何检索默认用户代理字符串。
// This call determines the required buffer size.
DWORD dwSize;
InternetQueryOption(NULL, INTERNET_OPTION_USER_AGENT, NULL, &dwSize);
// Allocate the necessary memory.
char *lpszData;
lpszData = new char[dwSize];
// Call InternetQueryOption again with the provided buffer.
InternetQueryOption( NULL,
INTERNET_OPTION_USER_AGENT,
lpszData, &dwSize );
// Insert code here to use the user agent string data.
// Free the allocated memory.
delete [] lpszData;
设置连接选项
在 Internet Explorer 5 及更高版本中,可以针对特定连接设置 Internet 选项。 以前,所有连接共享相同的 Internet 选项设置。 设置特定连接的选项:
- 创建 INTERNET_PER_CONN_OPTION_LIST 结构。
- 为要为连接设置的单个 Internet 选项分配内存。
- 在 INTERNET_PER_CONN_OPTION 结构中设置选项。
- 使用 InternetSetOption 设置选项。
下面的代码示例演示如何为 LAN 连接设置代理数据。
BOOL SetConnectionOptions()
{
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill the list structure.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = NULL;
// Set three options.
list.dwOptionCount = 3;
list.pOptions = new INTERNET_PER_CONN_OPTION[3];
// Ensure that the memory was allocated.
if(NULL == list.pOptions)
{
// Return FALSE if the memory wasn't allocated.
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
PROXY_TYPE_PROXY;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
list.pOptions[1].Value.pszValue = TEXT("https://proxy:80");
// Set proxy override.
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
list.pOptions[2].Value.pszValue = TEXT("local");
// Set the options on the connection.
bReturn = InternetSetOption(NULL,
INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory.
delete [] list.pOptions;
return bReturn;
}
检索连接选项
在 Internet Explorer 5 及更高版本中,可以从特定连接检索 Internet 选项。 从特定连接检索选项:
- 创建 INTERNET_PER_CONN_OPTION_LIST 结构。
- 为单个 Internet 选项分配内存,以便从连接中检索。
- 使用 INTERNET_PER_CONN_OPTION 结构指定选项。
- 使用 InternetQueryOption 检索选项。
- 利用选项数据。
- 使用 GlobalFree 函数释放用于保存选项数据的内存。
备注
WinINet 不支持服务器实现。 此外,不应从服务使用它。 对于服务器实现或服务,请使用 Microsoft Windows HTTP Services (WinHTTP) 。