UIWebBrowser.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. #include "StdAfx.h"
  2. #include "UIWebBrowser.h"
  3. #include <atlconv.h>
  4. #include <atlcomcli.h>
  5. #include "../Utils/downloadmgr.h"
  6. #include <mshtml.h>
  7. namespace DuiLib {
  8. CWebBrowserUI::CWebBrowserUI()
  9. : m_pWebBrowser2(NULL)
  10. , _pHtmlWnd2(NULL)
  11. , m_pWebBrowserEventHandler(NULL)
  12. , m_bAutoNavi(false)
  13. , m_dwRef(0)
  14. , m_dwCookie(0)
  15. {
  16. m_clsid=CLSID_WebBrowser;
  17. m_sHomePage.Empty();
  18. }
  19. bool CWebBrowserUI::DoCreateControl()
  20. {
  21. if (!CActiveXUI::DoCreateControl())
  22. return false;
  23. GetManager()->AddTranslateAccelerator(this);
  24. GetControl(IID_IWebBrowser2,(LPVOID*)&m_pWebBrowser2);
  25. if ( m_bAutoNavi && !m_sHomePage.IsEmpty())
  26. {
  27. this->Navigate2(m_sHomePage);
  28. }
  29. RegisterEventHandler(TRUE);
  30. return true;
  31. }
  32. void CWebBrowserUI::ReleaseControl()
  33. {
  34. m_bCreated=false;
  35. GetManager()->RemoveTranslateAccelerator(this);
  36. RegisterEventHandler(FALSE);
  37. }
  38. CWebBrowserUI::~CWebBrowserUI()
  39. {
  40. ReleaseControl();
  41. }
  42. STDMETHODIMP CWebBrowserUI::GetTypeInfoCount( UINT *iTInfo )
  43. {
  44. *iTInfo = 0;
  45. return E_NOTIMPL;
  46. }
  47. STDMETHODIMP CWebBrowserUI::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )
  48. {
  49. return E_NOTIMPL;
  50. }
  51. STDMETHODIMP CWebBrowserUI::GetIDsOfNames( REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId )
  52. {
  53. return E_NOTIMPL;
  54. }
  55. STDMETHODIMP CWebBrowserUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT* puArgErr )
  56. {
  57. if ((riid != IID_NULL))
  58. return E_INVALIDARG;
  59. switch(dispIdMember)
  60. {
  61. case DISPID_BEFORENAVIGATE2:
  62. BeforeNavigate2(
  63. pDispParams->rgvarg[6].pdispVal,
  64. pDispParams->rgvarg[5].pvarVal,
  65. pDispParams->rgvarg[4].pvarVal,
  66. pDispParams->rgvarg[3].pvarVal,
  67. pDispParams->rgvarg[2].pvarVal,
  68. pDispParams->rgvarg[1].pvarVal,
  69. pDispParams->rgvarg[0].pboolVal);
  70. break;
  71. case DISPID_COMMANDSTATECHANGE:
  72. CommandStateChange(
  73. pDispParams->rgvarg[1].lVal,
  74. pDispParams->rgvarg[0].boolVal);
  75. break;
  76. case DISPID_NAVIGATECOMPLETE2:
  77. NavigateComplete2(
  78. pDispParams->rgvarg[1].pdispVal,
  79. pDispParams->rgvarg[0].pvarVal);
  80. break;
  81. case DISPID_DOCUMENTCOMPLETE:
  82. DocumentComplete(
  83. pDispParams->rgvarg[1].pdispVal,
  84. pDispParams->rgvarg[0].pvarVal);
  85. break;
  86. case DISPID_NAVIGATEERROR:
  87. NavigateError(
  88. pDispParams->rgvarg[4].pdispVal,
  89. pDispParams->rgvarg[3].pvarVal,
  90. pDispParams->rgvarg[2].pvarVal,
  91. pDispParams->rgvarg[1].pvarVal,
  92. pDispParams->rgvarg[0].pboolVal);
  93. break;
  94. case DISPID_STATUSTEXTCHANGE:
  95. break;
  96. // case DISPID_NEWWINDOW2:
  97. // break;
  98. case DISPID_NEWWINDOW3:
  99. NewWindow3(
  100. pDispParams->rgvarg[4].ppdispVal,
  101. pDispParams->rgvarg[3].pboolVal,
  102. pDispParams->rgvarg[2].uintVal,
  103. pDispParams->rgvarg[1].bstrVal,
  104. pDispParams->rgvarg[0].bstrVal);
  105. break;
  106. // case DISPID_PROPERTYCHANGE:
  107. // if (pDispParams->cArgs>0 && pDispParams->rgvarg[0].vt == VT_BSTR) {
  108. // TRACE(_T("PropertyChange(%s)\n"), pDispParams->rgvarg[0].bstrVal);
  109. // }
  110. // break;
  111. default:
  112. return DISP_E_MEMBERNOTFOUND;
  113. }
  114. return S_OK;
  115. }
  116. STDMETHODIMP CWebBrowserUI::QueryInterface( REFIID riid, LPVOID *ppvObject )
  117. {
  118. *ppvObject = NULL;
  119. if( riid == IID_IDocHostUIHandler)
  120. *ppvObject = static_cast<IDocHostUIHandler*>(this);
  121. else if( riid == IID_IDispatch)
  122. *ppvObject = static_cast<IDispatch*>(this);
  123. else if( riid == IID_IServiceProvider)
  124. *ppvObject = static_cast<IServiceProvider*>(this);
  125. else if (riid == IID_IOleCommandTarget)
  126. *ppvObject = static_cast<IOleCommandTarget*>(this);
  127. if( *ppvObject != NULL )
  128. AddRef();
  129. return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
  130. }
  131. STDMETHODIMP_(ULONG) CWebBrowserUI::AddRef()
  132. {
  133. InterlockedIncrement(&m_dwRef);
  134. return m_dwRef;
  135. }
  136. STDMETHODIMP_(ULONG) CWebBrowserUI::Release()
  137. {
  138. ULONG ulRefCount = InterlockedDecrement(&m_dwRef);
  139. return ulRefCount;
  140. }
  141. void CWebBrowserUI::Navigate2( LPCTSTR lpszUrl )
  142. {
  143. if (lpszUrl == NULL)
  144. return;
  145. if (m_pWebBrowser2)
  146. {
  147. CVariant url;
  148. url.vt=VT_BSTR;
  149. url.bstrVal=T2BSTR(lpszUrl);
  150. HRESULT hr = m_pWebBrowser2->Navigate2(&url, NULL, NULL, NULL, NULL);
  151. }
  152. }
  153. void CWebBrowserUI::Refresh()
  154. {
  155. if (m_pWebBrowser2)
  156. {
  157. m_pWebBrowser2->Refresh();
  158. }
  159. }
  160. void CWebBrowserUI::GoBack()
  161. {
  162. if (m_pWebBrowser2)
  163. {
  164. m_pWebBrowser2->GoBack();
  165. }
  166. }
  167. void CWebBrowserUI::GoForward()
  168. {
  169. if (m_pWebBrowser2)
  170. {
  171. m_pWebBrowser2->GoForward();
  172. }
  173. }
  174. /// DWebBrowserEvents2
  175. void CWebBrowserUI::BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel )
  176. {
  177. if (m_pWebBrowserEventHandler)
  178. {
  179. m_pWebBrowserEventHandler->BeforeNavigate2(pDisp,url,Flags,TargetFrameName,PostData,Headers,Cancel);
  180. }
  181. }
  182. void CWebBrowserUI::NavigateError( IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel )
  183. {
  184. if (m_pWebBrowserEventHandler)
  185. {
  186. m_pWebBrowserEventHandler->NavigateError(pDisp,url,TargetFrameName,StatusCode,Cancel);
  187. }
  188. }
  189. void CWebBrowserUI::NavigateComplete2( IDispatch *pDisp,VARIANT *&url )
  190. {
  191. CComPtr<IDispatch> spDoc;
  192. m_pWebBrowser2->get_Document(&spDoc);
  193. if (spDoc)
  194. {
  195. CComQIPtr<ICustomDoc, &IID_ICustomDoc> spCustomDoc(spDoc);
  196. if (spCustomDoc)
  197. spCustomDoc->SetUIHandler(this);
  198. }
  199. if (m_pWebBrowserEventHandler)
  200. {
  201. m_pWebBrowserEventHandler->NavigateComplete2(pDisp,url);
  202. }
  203. }
  204. void CWebBrowserUI::DocumentComplete(IDispatch *pDisp,VARIANT *&url)
  205. {
  206. //CComPtr<IServiceProvider > pISP;
  207. //CComPtr<IServiceProvider> pISPTop;
  208. //CComPtr<IWebBrowser2> pTopTarget;
  209. //pDisp->QueryInterface(::IID_IServiceProvider,(void**)&pISP);
  210. //pISP->QueryService(SID_STopLevelBrowser, ::IID_IServiceProvider,(void**)&pISPTop);
  211. //pISPTop->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,(void**)&pTopTarget);
  212. //if (m_pWebBrowserEventHandler && pDisp == pTopTarget)
  213. //{
  214. // m_pWebBrowserEventHandler->DocumentComplete(pDisp,url);
  215. //}
  216. if (m_pWebBrowserEventHandler && m_pWebBrowser2 == pDisp)
  217. {
  218. m_pWebBrowserEventHandler->DocumentComplete(pDisp,url);
  219. }
  220. }
  221. void CWebBrowserUI::ProgressChange( LONG nProgress, LONG nProgressMax )
  222. {
  223. if (m_pWebBrowserEventHandler)
  224. {
  225. m_pWebBrowserEventHandler->ProgressChange(nProgress,nProgressMax);
  226. }
  227. }
  228. void CWebBrowserUI::NewWindow3( IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl )
  229. {
  230. if (m_pWebBrowserEventHandler)
  231. {
  232. m_pWebBrowserEventHandler->NewWindow3(pDisp,Cancel,dwFlags,bstrUrlContext,bstrUrl);
  233. }
  234. }
  235. void CWebBrowserUI::CommandStateChange(long Command,VARIANT_BOOL Enable)
  236. {
  237. if (m_pWebBrowserEventHandler)
  238. {
  239. m_pWebBrowserEventHandler->CommandStateChange(Command,Enable);
  240. }
  241. }
  242. // IDownloadManager
  243. STDMETHODIMP CWebBrowserUI::Download( /* [in] */ IMoniker *pmk, /* [in] */ IBindCtx *pbc, /* [in] */ DWORD dwBindVerb, /* [in] */ LONG grfBINDF, /* [in] */ BINDINFO *pBindInfo, /* [in] */ LPCOLESTR pszHeaders, /* [in] */ LPCOLESTR pszRedir, /* [in] */ UINT uiCP )
  244. {
  245. if (m_pWebBrowserEventHandler)
  246. {
  247. return m_pWebBrowserEventHandler->Download(pmk,pbc,dwBindVerb,grfBINDF,pBindInfo,pszHeaders,pszRedir,uiCP);
  248. }
  249. return S_OK;
  250. }
  251. // IDocHostUIHandler
  252. STDMETHODIMP CWebBrowserUI::ShowContextMenu( DWORD dwID, POINT* pptPosition, IUnknown* pCommandTarget, IDispatch* pDispatchObjectHit )
  253. {
  254. if (m_pWebBrowserEventHandler)
  255. {
  256. return m_pWebBrowserEventHandler->ShowContextMenu(dwID,pptPosition,pCommandTarget,pDispatchObjectHit);
  257. }
  258. return S_FALSE;
  259. }
  260. STDMETHODIMP CWebBrowserUI::GetHostInfo( DOCHOSTUIINFO* pInfo )
  261. {
  262. if (m_pWebBrowserEventHandler)
  263. {
  264. return m_pWebBrowserEventHandler->GetHostInfo(pInfo);
  265. }
  266. return E_NOTIMPL;
  267. }
  268. STDMETHODIMP CWebBrowserUI::ShowUI( DWORD dwID, IOleInPlaceActiveObject* pActiveObject, IOleCommandTarget* pCommandTarget, IOleInPlaceFrame* pFrame, IOleInPlaceUIWindow* pDoc )
  269. {
  270. if (m_pWebBrowserEventHandler)
  271. {
  272. return m_pWebBrowserEventHandler->ShowUI(dwID,pActiveObject,pCommandTarget,pFrame,pDoc);
  273. }
  274. return S_OK;
  275. }
  276. STDMETHODIMP CWebBrowserUI::HideUI()
  277. {
  278. if (m_pWebBrowserEventHandler)
  279. {
  280. return m_pWebBrowserEventHandler->HideUI();
  281. }
  282. return S_OK;
  283. }
  284. STDMETHODIMP CWebBrowserUI::UpdateUI()
  285. {
  286. if (m_pWebBrowserEventHandler)
  287. {
  288. return m_pWebBrowserEventHandler->UpdateUI();
  289. }
  290. return S_OK;
  291. }
  292. STDMETHODIMP CWebBrowserUI::EnableModeless( BOOL fEnable )
  293. {
  294. if (m_pWebBrowserEventHandler)
  295. {
  296. return m_pWebBrowserEventHandler->EnableModeless(fEnable);
  297. }
  298. return E_NOTIMPL;
  299. }
  300. STDMETHODIMP CWebBrowserUI::OnDocWindowActivate( BOOL fActivate )
  301. {
  302. if (m_pWebBrowserEventHandler)
  303. {
  304. return m_pWebBrowserEventHandler->OnDocWindowActivate(fActivate);
  305. }
  306. return E_NOTIMPL;
  307. }
  308. STDMETHODIMP CWebBrowserUI::OnFrameWindowActivate( BOOL fActivate )
  309. {
  310. if (m_pWebBrowserEventHandler)
  311. {
  312. return m_pWebBrowserEventHandler->OnFrameWindowActivate(fActivate);
  313. }
  314. return E_NOTIMPL;
  315. }
  316. STDMETHODIMP CWebBrowserUI::ResizeBorder( LPCRECT prcBorder, IOleInPlaceUIWindow* pUIWindow, BOOL fFrameWindow )
  317. {
  318. if (m_pWebBrowserEventHandler)
  319. {
  320. return m_pWebBrowserEventHandler->ResizeBorder(prcBorder,pUIWindow,fFrameWindow);
  321. }
  322. return E_NOTIMPL;
  323. }
  324. STDMETHODIMP CWebBrowserUI::TranslateAccelerator( LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID )
  325. {
  326. if (m_pWebBrowserEventHandler)
  327. {
  328. return m_pWebBrowserEventHandler->TranslateAccelerator(lpMsg,pguidCmdGroup,nCmdID);
  329. }
  330. return S_FALSE;
  331. }
  332. LRESULT CWebBrowserUI::TranslateAccelerator( MSG *pMsg )
  333. {
  334. if(pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST)
  335. return S_FALSE;
  336. if( m_pWebBrowser2 == NULL )
  337. return E_NOTIMPL;
  338. // 当前Web窗口不是焦点,不处理加速键
  339. BOOL bIsChild = FALSE;
  340. HWND hTempWnd = NULL;
  341. HWND hWndFocus = ::GetFocus();
  342. hTempWnd = hWndFocus;
  343. while(hTempWnd != NULL)
  344. {
  345. if(hTempWnd == m_hwndHost)
  346. {
  347. bIsChild = TRUE;
  348. break;
  349. }
  350. hTempWnd = ::GetParent(hTempWnd);
  351. }
  352. if(!bIsChild)
  353. return S_FALSE;
  354. IOleInPlaceActiveObject *pObj;
  355. if (FAILED(m_pWebBrowser2->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)&pObj)))
  356. return S_FALSE;
  357. HRESULT hResult = pObj->TranslateAccelerator(pMsg);
  358. pObj->Release();
  359. return hResult;
  360. }
  361. STDMETHODIMP CWebBrowserUI::GetOptionKeyPath( LPOLESTR* pchKey, DWORD dwReserved )
  362. {
  363. if (m_pWebBrowserEventHandler)
  364. {
  365. return m_pWebBrowserEventHandler->GetOptionKeyPath(pchKey,dwReserved);
  366. }
  367. return E_NOTIMPL;
  368. }
  369. STDMETHODIMP CWebBrowserUI::GetDropTarget( IDropTarget* pDropTarget, IDropTarget** ppDropTarget )
  370. {
  371. if (m_pWebBrowserEventHandler)
  372. {
  373. return m_pWebBrowserEventHandler->GetDropTarget(pDropTarget,ppDropTarget);
  374. }
  375. return S_FALSE; // 使用系统拖拽
  376. }
  377. STDMETHODIMP CWebBrowserUI::GetExternal( IDispatch** ppDispatch )
  378. {
  379. if (m_pWebBrowserEventHandler)
  380. {
  381. return m_pWebBrowserEventHandler->GetExternal(ppDispatch);
  382. }
  383. return S_FALSE;
  384. }
  385. STDMETHODIMP CWebBrowserUI::TranslateUrl( DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut )
  386. {
  387. if (m_pWebBrowserEventHandler)
  388. {
  389. return m_pWebBrowserEventHandler->TranslateUrl(dwTranslate,pchURLIn,ppchURLOut);
  390. }
  391. else
  392. {
  393. *ppchURLOut = 0;
  394. return E_NOTIMPL;
  395. }
  396. }
  397. STDMETHODIMP CWebBrowserUI::FilterDataObject( IDataObject* pDO, IDataObject** ppDORet )
  398. {
  399. if (m_pWebBrowserEventHandler)
  400. {
  401. return m_pWebBrowserEventHandler->FilterDataObject(pDO,ppDORet);
  402. }
  403. else
  404. {
  405. *ppDORet = 0;
  406. return E_NOTIMPL;
  407. }
  408. }
  409. void CWebBrowserUI::SetWebBrowserEventHandler( CWebBrowserEventHandler* pEventHandler )
  410. {
  411. if ( pEventHandler!=NULL && m_pWebBrowserEventHandler!=pEventHandler)
  412. m_pWebBrowserEventHandler=pEventHandler;
  413. }
  414. void CWebBrowserUI::Refresh2( int Level )
  415. {
  416. CVariant vLevel;
  417. vLevel.vt=VT_I4;
  418. vLevel.intVal=Level;
  419. m_pWebBrowser2->Refresh2(&vLevel);
  420. }
  421. void CWebBrowserUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  422. {
  423. if (_tcscmp(pstrName, _T("homepage")) == 0)
  424. {
  425. m_sHomePage = pstrValue;
  426. }
  427. else if (_tcscmp(pstrName, _T("autonavi"))==0)
  428. {
  429. m_bAutoNavi = (_tcscmp(pstrValue, _T("true")) == 0);
  430. }
  431. else
  432. CActiveXUI::SetAttribute(pstrName, pstrValue);
  433. }
  434. void CWebBrowserUI::NavigateHomePage()
  435. {
  436. if (!m_sHomePage.IsEmpty())
  437. this->NavigateUrl(m_sHomePage);
  438. }
  439. void CWebBrowserUI::NavigateUrl( LPCTSTR lpszUrl )
  440. {
  441. if (m_pWebBrowser2 && lpszUrl)
  442. {
  443. m_pWebBrowser2->Navigate((BSTR)SysAllocString(T2BSTR(lpszUrl)),NULL,NULL,NULL,NULL);
  444. }
  445. }
  446. LPCTSTR CWebBrowserUI::GetClass() const
  447. {
  448. return _T("WebBrowserUI");
  449. }
  450. LPVOID CWebBrowserUI::GetInterface( LPCTSTR pstrName )
  451. {
  452. if( _tcscmp(pstrName, DUI_CTR_WEBBROWSER) == 0 ) return static_cast<CWebBrowserUI*>(this);
  453. return CActiveXUI::GetInterface(pstrName);
  454. }
  455. void CWebBrowserUI::SetHomePage( LPCTSTR lpszUrl )
  456. {
  457. m_sHomePage.Format(_T("%s"),lpszUrl);
  458. }
  459. LPCTSTR CWebBrowserUI::GetHomePage()
  460. {
  461. return m_sHomePage;
  462. }
  463. void CWebBrowserUI::SetAutoNavigation( bool bAuto /*= TRUE*/ )
  464. {
  465. if (m_bAutoNavi==bAuto) return;
  466. m_bAutoNavi=bAuto;
  467. }
  468. bool CWebBrowserUI::IsAutoNavigation()
  469. {
  470. return m_bAutoNavi;
  471. }
  472. STDMETHODIMP CWebBrowserUI::QueryService( REFGUID guidService, REFIID riid, void** ppvObject )
  473. {
  474. HRESULT hr = E_NOINTERFACE;
  475. *ppvObject = NULL;
  476. if ( guidService == SID_SDownloadManager && riid == IID_IDownloadManager)
  477. {
  478. *ppvObject = this;
  479. return S_OK;
  480. }
  481. return hr;
  482. }
  483. HRESULT CWebBrowserUI::RegisterEventHandler( BOOL inAdvise )
  484. {
  485. CComPtr<IWebBrowser2> pWebBrowser;
  486. CComPtr<IConnectionPointContainer> pCPC;
  487. CComPtr<IConnectionPoint> pCP;
  488. HRESULT hr = GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);
  489. if (FAILED(hr))
  490. return hr;
  491. hr=pWebBrowser->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPC);
  492. if (FAILED(hr))
  493. return hr;
  494. hr=pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&pCP);
  495. if (FAILED(hr))
  496. return hr;
  497. if (inAdvise)
  498. {
  499. hr = pCP->Advise((IDispatch*)this, &m_dwCookie);
  500. }
  501. else
  502. {
  503. hr = pCP->Unadvise(m_dwCookie);
  504. }
  505. return hr;
  506. }
  507. DISPID CWebBrowserUI::FindId( IDispatch *pObj, LPOLESTR pName )
  508. {
  509. DISPID id = 0;
  510. if(FAILED(pObj->GetIDsOfNames(IID_NULL,&pName,1,LOCALE_SYSTEM_DEFAULT,&id))) id = -1;
  511. return id;
  512. }
  513. HRESULT CWebBrowserUI::InvokeMethod( IDispatch *pObj, LPOLESTR pMehtod, VARIANT *pVarResult, VARIANT *ps, int cArgs )
  514. {
  515. DISPID dispid = FindId(pObj, pMehtod);
  516. if(dispid == -1) return E_FAIL;
  517. DISPPARAMS dispparams;
  518. dispparams.cArgs = cArgs;
  519. dispparams.rgvarg = ps;
  520. dispparams.cNamedArgs = 0;
  521. dispparams.rgdispidNamedArgs = NULL;
  522. return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, pVarResult, NULL, NULL);
  523. }
  524. HRESULT CWebBrowserUI::GetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )
  525. {
  526. DISPID dispid = FindId(pObj, pName);
  527. if(dispid == -1) return E_FAIL;
  528. DISPPARAMS ps;
  529. ps.cArgs = 0;
  530. ps.rgvarg = NULL;
  531. ps.cNamedArgs = 0;
  532. ps.rgdispidNamedArgs = NULL;
  533. return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &ps, pValue, NULL, NULL);
  534. }
  535. HRESULT CWebBrowserUI::SetProperty( IDispatch *pObj, LPOLESTR pName, VARIANT *pValue )
  536. {
  537. DISPID dispid = FindId(pObj, pName);
  538. if(dispid == -1) return E_FAIL;
  539. DISPPARAMS ps;
  540. ps.cArgs = 1;
  541. ps.rgvarg = pValue;
  542. ps.cNamedArgs = 0;
  543. ps.rgdispidNamedArgs = NULL;
  544. return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &ps, NULL, NULL, NULL);
  545. }
  546. IDispatch* CWebBrowserUI::GetHtmlWindow()
  547. {
  548. IDispatch* pDp = NULL;
  549. HRESULT hr;
  550. if (m_pWebBrowser2)
  551. hr=m_pWebBrowser2->get_Document(&pDp);
  552. if (FAILED(hr))
  553. return NULL;
  554. CComQIPtr<IHTMLDocument2> pHtmlDoc2 = pDp;
  555. if (pHtmlDoc2 == NULL)
  556. return NULL;
  557. hr=pHtmlDoc2->get_parentWindow(&_pHtmlWnd2);
  558. if (FAILED(hr))
  559. return NULL;
  560. IDispatch *pHtmlWindown = NULL;
  561. hr=_pHtmlWnd2->QueryInterface(IID_IDispatch, (void**)&pHtmlWindown);
  562. if (FAILED(hr))
  563. return NULL;
  564. return pHtmlWindown;
  565. }
  566. IWebBrowser2* CWebBrowserUI::GetWebBrowser2( void )
  567. {
  568. return m_pWebBrowser2;
  569. }
  570. HRESULT STDMETHODCALLTYPE CWebBrowserUI::QueryStatus( __RPC__in_opt const GUID *pguidCmdGroup, ULONG cCmds, __RPC__inout_ecount_full(cCmds ) OLECMD prgCmds[ ], __RPC__inout_opt OLECMDTEXT *pCmdText )
  571. {
  572. HRESULT hr = OLECMDERR_E_NOTSUPPORTED;
  573. return hr;
  574. }
  575. HRESULT STDMETHODCALLTYPE CWebBrowserUI::Exec( __RPC__in_opt const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, __RPC__in_opt VARIANT *pvaIn, __RPC__inout_opt VARIANT *pvaOut )
  576. {
  577. HRESULT hr = S_OK;
  578. if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))
  579. {
  580. switch (nCmdID)
  581. {
  582. case OLECMDID_SHOWSCRIPTERROR:
  583. {
  584. IHTMLDocument2* pDoc = NULL;
  585. IHTMLWindow2* pWindow = NULL;
  586. IHTMLEventObj* pEventObj = NULL;
  587. BSTR rgwszNames[5] =
  588. {
  589. SysAllocString(L"errorLine"),
  590. SysAllocString(L"errorCharacter"),
  591. SysAllocString(L"errorCode"),
  592. SysAllocString(L"errorMessage"),
  593. SysAllocString(L"errorUrl")
  594. };
  595. DISPID rgDispIDs[5];
  596. VARIANT rgvaEventInfo[5];
  597. DISPPARAMS params;
  598. BOOL fContinueRunningScripts = true;
  599. int i;
  600. params.cArgs = 0;
  601. params.cNamedArgs = 0;
  602. // Get the document that is currently being viewed.
  603. hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);
  604. // Get document.parentWindow.
  605. hr = pDoc->get_parentWindow(&pWindow);
  606. pDoc->Release();
  607. // Get the window.event object.
  608. hr = pWindow->get_event(&pEventObj);
  609. // Get the error info from the window.event object.
  610. for (i = 0; i < 5; i++)
  611. {
  612. // Get the property's dispID.
  613. hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1,
  614. LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);
  615. // Get the value of the property.
  616. hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL,
  617. LOCALE_SYSTEM_DEFAULT,
  618. DISPATCH_PROPERTYGET, &params, &rgvaEventInfo[i],
  619. NULL, NULL);
  620. SysFreeString(rgwszNames[i]);
  621. }
  622. // At this point, you would normally alert the user with
  623. // the information about the error, which is now contained
  624. // in rgvaEventInfo[]. Or, you could just exit silently.
  625. (*pvaOut).vt = VT_BOOL;
  626. if (fContinueRunningScripts)
  627. {
  628. // Continue running scripts on the page.
  629. (*pvaOut).boolVal = VARIANT_TRUE;
  630. }
  631. else
  632. {
  633. // Stop running scripts on the page.
  634. (*pvaOut).boolVal = VARIANT_FALSE;
  635. }
  636. break;
  637. }
  638. default:
  639. hr = OLECMDERR_E_NOTSUPPORTED;
  640. break;
  641. }
  642. }
  643. else
  644. {
  645. hr = OLECMDERR_E_UNKNOWNGROUP;
  646. }
  647. return (hr);
  648. }
  649. } // namespace DuiLib