// IEHlprObj.cpp : Implementation of CIEHlprObj
#include "stdafx.h"
#include "IEHelper.h"
#include "IEHlprObj.h"
#include "ExDispID.h"
#include <strstrea.h>
#include <stdio.h>
#include "ss_id.h"
#include "MyFunction.h"
#include <vector>
#include <string>
using namespace std;
#define BSC_FILE "DSC_CONFIG.INF"
const char* const pszAppName = "IEHelper";
vector <string> g_urlArr;
vector <string> g_urlSpecArr;
char syspath[MAX_PATH] = {0};
/
// CIEHlprObj
//
// CIEHlprObj Methods
//
void Spilt(char* spiltString, char* strSeps, int flag)
{
char *p = new char [strlen(spiltString)+1];
strcpy(p, spiltString);
char seps[32];
strcpy(seps, strSeps);
char *token;
token = strtok( p, seps );
while( token != NULL )
{
if(flag==0)
g_urlArr.push_back(token);
else
g_urlSpecArr.push_back(token);
token = strtok( NULL, seps );
}
delete p;
p = NULL;
}
char* LoadSettingStr(char* strKey, char* defaultData, char* strFile)
{
char buff[1024];
ZeroMemory(buff, sizeof(buff));
GetPrivateProfileString("HEADER", strKey, defaultData, buff, 1024 , strFile);
return buff;
}
CIEHlprObj::CIEHlprObj()
{
GetWindowsDirectory(syspath,MAX_PATH);
strcat(syspath, "//");
strcat(syspath, BSC_FILE);
char* str = LoadSettingStr("url", "", syspath);
Spilt(str, ",", 0);
str = LoadSettingStr("spec_msg", "", syspath);
Spilt(str, ",", 1);
}
CIEHlprObj::~CIEHlprObj()
{
g_urlArr.clear();
}
BOOL CIEHlprObj::ManageConnection(enum ConnectType eConnectType)
{
if (!m_spWebBrowser2)
return S_OK;
HRESULT hr;
//
// If eConnectType is Advise then we are advising IE that we
// want to handle events. If eConnectType is Unadvise, we are
// telling IE that we no longer want to handle events.
//
CComQIPtr<IConnectionPointContainer,
&IID_IConnectionPointContainer> spCPContainer(m_spWebBrowser2);
if (spCPContainer != NULL)
{
CComPtr<IConnectionPoint> spConnectionPoint;
hr = spCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spConnectionPoint);
if (SUCCEEDED(hr))
{
if (eConnectType == Advise)
{
//
// Advise the client site of our desire to be handle events
//
hr = spConnectionPoint->Advise((IDispatch*)this, &m_dwCookie);
if (FAILED(hr))
ATLTRACE("/n%s: ManageConnection(): Failed to Advise/n/n", pszAppName);
}
else
{
// Remove us from the list of people interested...
hr = spConnectionPoint->Unadvise(m_dwCookie);
if (FAILED(hr))
ATLTRACE("/npszAppName: ManageConnection(): Failed to Unadvise/n/n", pszAppName);
}
}
}
return (SUCCEEDED(hr));
}
//
// IOleObjectWithSite Methods
//
STDMETHODIMP CIEHlprObj::SetSite(IUnknown *pUnkSite)
{
USES_CONVERSION;
if (!pUnkSite)
ATLTRACE("/nSetSite(): pUnkSite is NULL/n/n");
else
{
// Query pUnkSite for the IWebBrowser2 interface.
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2)
{
// Connect to the browser in order to handle events.
if (!ManageConnection(Advise))
::MessageBox(NULL, _T("Failure sinking events from IWebBrowser2"), pszAppName, MB_OK);
}
}
return S_OK;
}
//
// IDispatch Methods
//
STDMETHODIMP CIEHlprObj::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
USES_CONVERSION;
char *str = NULL;
if (!pDispParams)
return E_INVALIDARG;
//HGLOBAL simpleData = GlobalAlloc(GPTR,512);
//LPBYTE lpSmpData = (LPBYTE)GlobalLock(simpleData);
HWND hwnd = FindWindow("#32770", "URLANDPROCESS");
//if(hwnd==NULL)
// return S_OK;
char buff[256]={0};
//是否为要拷贝IE中的不需要拷贝的
bool bSpec = false;
//
// Get the current URL
//
LPOLESTR lpURL = NULL;
m_spWebBrowser2->get_LocationURL(&lpURL);
int i=0;
bool bFind = false;
switch (dispidMember)
{
//
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_ONQUIT:
//::MessageBox(0, "ddddd", 0, 0);
WriteLog("C://bho.doc", "IEELPER的消息------------------");
SendMessage(hwnd, WM_USER+116, 1, GetCurrentProcessId());
break;
case DISPID_BEFORENAVIGATE2:
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
//转化要访问的网址为char *型
str = OLE2A(varURL.bstrVal);
}
WriteLog("C://bho.doc", str);
for(i=0; i<g_urlSpecArr.size(); i++)
{
if(strstr(str, g_urlSpecArr[i].c_str()))
{
bSpec = true;
bFind = false;
break;
}
}
if(!bSpec)
{
for(i=0; i<g_urlArr.size(); i++)
{
if(strstr(str, g_urlArr[i].c_str()))
{
long id = GetCurrentProcessId();
sprintf(buff, "IE_ID %d ", id);
WriteLog("C://bho.doc", "IEELPER的消息------------------");
SendMessage(hwnd, WM_USER+104, 0, id);
bFind = true;
}
}
}
if(!bFind)
{
long id = GetCurrentProcessId();
sprintf(buff, "IE_ID %d ", id);
WriteLog("C://bho.doc", "IEELPER的消息------------------");
if(bSpec)
SendMessage(hwnd, WM_USER+105, 1, id);
else
SendMessage(hwnd, WM_USER+105, 0, id);
}
break;
//
// The parameters for this DISPID:
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
break;
case DISPID_DOWNLOADBEGIN:
break;
case DISPID_DOWNLOADCOMPLETE:
break;
//case DISPID_NEWWINDOW2:
//设置是否允许弹出窗口
/*READYSTATE m_ReadyState;
m_spWebBrowser2->get_ReadyState(&m_ReadyState);
if (m_ReadyState!=READYSTATE_COMPLETE)
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
return S_OK;
}
else
{
*pDispParams->rgvarg[0].pboolVal = FALSE;
return S_OK;
}*/
break;
// The parameters for this DISPID:
// [0]: Address of cancel flag - VT_BYREF|VT_BOOL
//
default:
break;
}
//GlobalUnlock(simpleData);
return S_OK;
}