获取IE代理服务器信息
“局域网设置”里有自动配置、代理服务器的设置项目,在进行网络通讯相关的开发时,需要使用到它们,下边介绍如何将这些设置信息读取出来。
当“使用自动配置脚本”不使用时,使用WinHttpGetIEProxyConfigForCurrentUser函数来获取用户的代理配置。如果发现用户使用了自动配置脚本,那么就需要使用API
WinHttpGetProxyForUrl去获取某个url对应的代理。获取到代理之后需要考虑:1、是否需要拆分http、https、ftp、socks;2、hostname是否在“例外”中,需要考虑bypass有"<local>"的处理。
补充:使用自动配置脚本(也就是使用PAC文件)注意:1、IE设置里的pac文件路径不能是本地磁盘路径,否则WinHttpGetProxyForUrl函数无法正确执行;2、WinHttpGetProxyForUrl的第二个参数必须是http/https开头的完整路径。
核心API就仅仅是WinHttpGetIEProxyConfigForCurrentUser和WinHttpGetProxyForUrl,可以在chromium中搜索这两关键函数获取chromium的实现代码。
我使用的部分代码:
std::wstring CIEProxy::GetIEProxy( const std::wstring& strURL, const E_proxy_type& eProxyType )
{
std::wstring strRet_cswuyg;
WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions = {};
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ieProxyConfig = {};
BOOL bAutoDetect = FALSE; //“自动检测设置”,但有时候即便选择上也会返回0,所以需要根据url判断
if(::WinHttpGetIEProxyConfigForCurrentUser(&ieProxyConfig))
{
if(ieProxyConfig.fAutoDetect)
{
bAutoDetect = TRUE;
}
if( ieProxyConfig.lpszAutoConfigUrl != NULL )
{
bAutoDetect = TRUE;
autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl;
}
}
else
{
// error
return strRet_cswuyg;
} if(bAutoDetect)
{
if (autoProxyOptions.lpszAutoConfigUrl != NULL)
{
autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
}
else
{
autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
}
autoProxyOptions.fAutoLogonIfChallenged = TRUE;
HINTERNET hSession = ::WinHttpOpen(, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC);
if (hSession != NULL)
{
WINHTTP_PROXY_INFO autoProxyInfo = {};
bAutoDetect = ::WinHttpGetProxyForUrl(hSession, strURL.c_str(), &autoProxyOptions, &autoProxyInfo);
if (hSession!= NULL)
{
::WinHttpCloseHandle(hSession);
}
if(autoProxyInfo.lpszProxy)
{
if (autoProxyInfo.lpszProxyBypass == NULL || CheckPassBy(strURL, autoProxyInfo.lpszProxyBypass))
{
std::wstring strProxyAddr = autoProxyInfo.lpszProxy;
strRet_cswuyg = GetProxyFromString(eProxyType, strProxyAddr);
}
if(autoProxyInfo.lpszProxy != NULL)
{
GlobalFree(autoProxyInfo.lpszProxy);
}
if(autoProxyInfo.lpszProxyBypass !=NULL)
{
GlobalFree(autoProxyInfo.lpszProxyBypass);
}
}
}
}
else
{
if(ieProxyConfig.lpszProxy != NULL)
{
if(ieProxyConfig.lpszProxyBypass == NULL || CheckPassBy(strURL, ieProxyConfig.lpszProxyBypass))
{
std::wstring strProxyAddr = ieProxyConfig.lpszProxy;
strRet_cswuyg = GetProxyFromString(eProxyType, strProxyAddr);
}
}
} if(ieProxyConfig.lpszAutoConfigUrl != NULL)
{
::GlobalFree(ieProxyConfig.lpszAutoConfigUrl);
}
if(ieProxyConfig.lpszProxy != NULL)
{
::GlobalFree(ieProxyConfig.lpszProxy);
}
if(ieProxyConfig.lpszProxyBypass != NULL)
{
::GlobalFree(ieProxyConfig.lpszProxyBypass);
} return strRet_cswuyg;
}
插入:WinHTTP部分,WinHttpGetDefaultProxyConfiguration 用于从注册表获取WinHTTP的代理设置。这个代理设置是通过WinHttpSetDefaultProxyConfiguration或者ProxyCfg.exe设置的。跟IE代理不同。
参考:
1、chromium源码:
chromium/src/net/proxy/proxy_resolver_winhttp.cc
chromium/src/net/proxy/proxy_config.cc
chromium/src/net/proxy/proxy_bypass_rules.h
2、MSDN:
3、零碎资源:
http://stackoverflow.com/questions/202547/how-do-i-find-out-the-browsers-proxy-settings
http://www.cnblogs.com/chang290/archive/2013/01/12/2857426.html
获取IE代理服务器信息的更多相关文章
- sql 2012中获取表的信息,包含字段的描述
1.获取数据库中的表 select name from sysobjects where type='U' 2.获取表字段(此处是Route表) Select name from syscolumns ...
- ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,
一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...
- 获取应用程序信息.h
//// 获取应用程序信息.h// IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ...
- PHP获取当前服务器信息的基本语句
下面是PHP获取当前服务器信息的基本语句. PHP程式版本: <?PHP echo PHP_VERSION; ?> ZEND版本: <?PHP echo zend_version() ...
- C# 获取 mp3文件信息
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- Linux sysinfo获取系统相关信息
Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h& ...
- android播放器如何获取音乐文件信息
转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...
- [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论
前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...
- andriod 获取电池的信息
<?xml version="1.0"?> <LinearLayout android:orientation="vertical" andr ...
随机推荐
- 保存会话数据——session学习
Session:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资 ...
- MVC客户端验证配置
<appSettings> <add key="ClientValidationEnabled" value="true"/> < ...
- openstack 排错
1.查看日志 grep ERROR /var/log/keystone/keystone.log 2. # nova list ERROR:n/a (http 404) 检查环境变量是否正确.
- redis问题
phalcon 在读取数据的时候如果说reids数据库没有连接成功的话,则会显示一下错误:
- c++ 操作符 重载。
操作符如关系操作符,全局函数的话,必须第一个是class. 1.赋值(=),下标([ ]),调用(())和成员访问箭头(->)等操作符必须定义为成员,如果定义为非成员的话,程序在编译的时候,会发 ...
- 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...
- .net ftp上传文件方法
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- JavaWeb学习总结(十二)--事务
一.事务的介绍 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功 ...
- Android 可拖动列表项的ListView
需求分析 一个界面内两个ListView 我关注的栏目列表 上面的要长按后可拖动排序 点击减号后列表项消失 下面列表增加一行 同时存储相应字符串到本地作为标记 未关注栏目列表 普通ListView 点 ...
- golang时间
//获取本地location toBeCharge := "2015-01-01 00:00:00" //待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板 ...