IEHlprObj.cpp
上传用户:lexian2
上传日期:2021-05-21
资源大小:3915k
文件大小:5k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. // IEHlprObj.cpp : Implementation of CIEHlprObj
  2. #include "stdafx.h"
  3. #include "IEHelper.h"
  4. #include "IEHlprObj.h"
  5. #include "ExDispID.h"
  6. #include <strstrea.h>
  7. #include <stdio.h>
  8. const char* const pszAppName = "IEHelper";
  9. /////////////////////////////////////////////////////////////////////////////
  10. // CIEHlprObj
  11. //
  12. // CIEHlprObj Methods
  13. //
  14. CIEHlprObj::~CIEHlprObj()
  15. {
  16. }
  17. BOOL CIEHlprObj::ManageConnection(enum ConnectType eConnectType)
  18. {
  19. if (!m_spWebBrowser2)
  20. return S_OK;
  21. HRESULT hr;
  22. //
  23. // If eConnectType is Advise then we are advising IE that we
  24. // want to handle events.  If eConnectType is Unadvise, we are
  25. // telling IE that we no longer want to handle events.
  26. //
  27. CComQIPtr<IConnectionPointContainer,
  28. &IID_IConnectionPointContainer> spCPContainer(m_spWebBrowser2);
  29. if (spCPContainer != NULL)
  30. {
  31. CComPtr<IConnectionPoint> spConnectionPoint;
  32. hr = spCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spConnectionPoint);
  33. if (SUCCEEDED(hr))
  34. {
  35. if (eConnectType == Advise)
  36. {
  37. //
  38. // Advise the client site of our desire to be handle events
  39. //
  40. hr = spConnectionPoint->Advise((IDispatch*)this, &m_dwCookie);
  41. if (FAILED(hr))
  42. ATLTRACE("n%s: ManageConnection(): Failed to Advisenn", pszAppName);
  43. }
  44. else
  45. {
  46. // Remove us from the list of people interested...
  47. hr = spConnectionPoint->Unadvise(m_dwCookie);
  48. if (FAILED(hr))
  49. ATLTRACE("npszAppName: ManageConnection(): Failed to Unadvisenn", pszAppName);
  50. }
  51. }
  52. }
  53. return (SUCCEEDED(hr));
  54. }
  55. //
  56. // IOleObjectWithSite Methods
  57. //
  58. STDMETHODIMP CIEHlprObj::SetSite(IUnknown *pUnkSite)
  59. {
  60. USES_CONVERSION;
  61. if (!pUnkSite)
  62. ATLTRACE("nSetSite(): pUnkSite is NULLnn");
  63. else
  64. {
  65. // Query pUnkSite for the IWebBrowser2 interface.
  66. m_spWebBrowser2 = pUnkSite;
  67. if (m_spWebBrowser2)
  68. {
  69. // Connect to the browser in order to handle events.
  70. if (!ManageConnection(Advise))
  71. ::MessageBox(NULL, _T("Failure sinking events from IWebBrowser2"), pszAppName, MB_OK);
  72. }
  73. }
  74. return S_OK;
  75. }
  76. //
  77. // IDispatch Methods
  78. //
  79. STDMETHODIMP CIEHlprObj::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
  80.                                 DISPPARAMS* pDispParams, VARIANT* pvarResult,
  81.                                 EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
  82. {
  83. USES_CONVERSION;
  84. if (!pDispParams)
  85. return E_INVALIDARG;
  86. //
  87. // Get the current URL
  88. //  
  89. LPOLESTR lpURL = NULL;
  90. m_spWebBrowser2->get_LocationURL(&lpURL);
  91. switch (dispidMember)
  92. {
  93. //
  94. // The parameters for this DISPID are as follows:
  95. // [0]: Cancel flag  - VT_BYREF|VT_BOOL
  96. // [1]: HTTP headers - VT_BYREF|VT_VARIANT
  97. // [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
  98. // [3]: Target frame name - VT_BYREF|VT_VARIANT 
  99. // [4]: Option flags - VT_BYREF|VT_VARIANT
  100. // [5]: URL to navigate to - VT_BYREF|VT_VARIANT
  101. // [6]: An object that evaluates to the top-level or frame
  102. //      WebBrowser object corresponding to the event. 
  103. //
  104. case DISPID_BEFORENAVIGATE2:
  105. char *str;
  106. if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
  107. {
  108.             CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
  109.             varURL.ChangeType(VT_BSTR);
  110. //转化要访问的网址为char *型
  111. str = OLE2A(varURL.bstrVal);
  112. }
  113. //如果正要访问的网址为要被拦截的,则stop
  114. if(strstr(str,"www.sina.com.cn")!=NULL)
  115. {
  116.             *pDispParams->rgvarg[0].pboolVal = TRUE;
  117.     MessageBox(NULL,"当前系统禁止浏览该页","警告",MB_ICONSTOP);
  118. return S_OK;
  119. }
  120. break;
  121. //
  122. // The parameters for this DISPID:
  123. // [0]: URL navigated to - VT_BYREF|VT_VARIANT
  124. // [1]: An object that evaluates to the top-level or frame
  125. //      WebBrowser object corresponding to the event. 
  126. //
  127. case DISPID_NAVIGATECOMPLETE2:
  128. break;
  129. case DISPID_DOCUMENTCOMPLETE:
  130. break;
  131. case DISPID_DOWNLOADBEGIN:
  132. break;
  133. case DISPID_DOWNLOADCOMPLETE:
  134. break;
  135. case DISPID_NEWWINDOW2:
  136. //设置是否允许弹出窗口
  137. /*READYSTATE m_ReadyState;
  138.         m_spWebBrowser2->get_ReadyState(&m_ReadyState);
  139.         if (m_ReadyState!=READYSTATE_COMPLETE)
  140.         {
  141.             *pDispParams->rgvarg[0].pboolVal = TRUE;
  142.             return S_OK;
  143.         }
  144. else
  145. {
  146.             *pDispParams->rgvarg[0].pboolVal = FALSE;
  147.             return S_OK;
  148. }*/
  149.     break;
  150. // The parameters for this DISPID:
  151. // [0]: Address of cancel flag - VT_BYREF|VT_BOOL
  152. //
  153. case DISPID_QUIT:
  154. break;
  155. default:
  156. break;
  157. }
  158. return S_OK;
  159. }