跪请众朋友帮我找下问题出在哪里?--3

// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值