c++获取系统代理信息

一、注册表方式

BOOL GetProxyServer(OUT LPSTR lpHostName_, OUT int& nport_)
{	 
	DWORD _dwProxyEnable = 0;
	QKPlugin_GetRegistryDw(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("ProxyEnable"), _dwProxyEnable);
	if (!_dwProxyEnable)
		return FALSE;
 
	CString  _strProxyServer = QKPlugin_GetRegistryStr(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), _T("ProxyServer"));
	_strProxyServer.MakeLower();
	int _nhttpleng = -1;
	_nhttpleng = _strProxyServer.Find(_T("http="));

	// 格式解析 ftp=127.0.0.1:10001;gopher=127.0.0.1:10001;http=127.0.0.1:10001;https=127.0.0.1:10001;socks=127.0.0.1:10002;lq=1
	if (_nhttpleng != -1)
	{
		_strProxyServer = _strProxyServer.Right(_strProxyServer.GetLength() - _nhttpleng - strlen("http="));
		if (_strProxyServer.Find(_T(";")) != -1)
			_strProxyServer = _strProxyServer.Left(_strProxyServer.Find(_T(";")));

		int _x1 = 0, _x2 = 0, _x3 = 0, _x4 = 0, _port = 0;
		swscanf(_strProxyServer, _T("%d.%d.%d.%d:%d"), &_x1, &_x2, &_x3, &_x4, &_port);
		CHAR _szHostname[100] = { NULL };
		sprintf(_szHostname, "%d.%d.%d.%d", _x1, _x2, _x3, _x4);

		nport_ = _port;
		strcpy_s(lpHostName_, 100, _szHostname);

		if (_port != 0)
			return TRUE;		
	}

	// 格式解析 127.0.0.1:10001 或者dlsh.cooc:80
	int _port = 0;
	CString _strHostname;
	int _nColon = _strProxyServer.Find(_T(":"));
	if (_nColon == -1)
		return FALSE;

	_strHostname = _strProxyServer.Left(_nColon);
	_port = _ttoi(_strProxyServer.Right(_strProxyServer.GetLength()-_nColon-1));
		
	nport_ = _port;	
	int _ntemp=100;
	UnicodeToMbcs(_strHostname.GetBuffer(), lpHostName_, _ntemp);

	if (_port == 0)
		return FALSE;
 
	return TRUE;
}

 

二、API

#include"wininet.h"
#pragma comment(lib, "Wininet.lib")
BOOL GetWinetProxy(LPSTR lpszProxy, UINT nProxyLen)
{
  
	unsigned long        nSize = 4096;
	char                 szBuf[4096] = { 0 };
	INTERNET_PROXY_INFO* pProxyInfo = (INTERNET_PROXY_INFO*)szBuf;
	if (!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pProxyInfo, &nSize))
	{
		return FALSE;
	}
	if (pProxyInfo->dwAccessType == INTERNET_OPEN_TYPE_DIRECT)
	{
		return FALSE;
	}

	//这里是代理列表,以\0分隔,结束处两个\0\0,一般我们取第一条代理就够了

	LPCSTR lpszProxyList = (LPCSTR)(pProxyInfo + 1);
	int nLen = strlen(lpszProxyList);
	if (lpszProxy)
	{
		 
		nProxyLen = min(nLen, nProxyLen - 1);
		strncpy_s(lpszProxy, nProxyLen+1,lpszProxyList, nLen);
		lpszProxy[nProxyLen] = 0;
	}
 	return nLen;
 

	/* // 方法2
	 INTERNET_PER_CONN_OPTION_LISTA    List;
	INTERNET_PER_CONN_OPTIONA         Option[1];
	 unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LISTA);


	Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
	List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
	List.pszConnection = NULL;
	List.dwOptionCount = 1;
	List.dwOptionError = 0;
	List.pOptions = Option;


	if(!InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
	{
	return FALSE;
	}
	if(Option[0].Value.pszValue != NULL)
	{
	int nLen = strlen(Option[0].Value.pszValue);
	if (lpszProxy)
	{
	nProxyLen = min(nLen, nProxyLen-1);
	strncpy_s(lpszProxy,nProxyLen+1, Option[0].Value.pszValue, nProxyLen);
	lpszProxy[nProxyLen] = 0;
	}
	GlobalFree(Option[0].Value.pszValue);
	return nLen;
	} 
	*/
	return FALSE;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值