Artigo: 261003 - Última revisão: sexta-feira, 21 de Abril de 2006 - Revisão: 3.0

Como deve tratar erros de script como um anfitrião de controlo WebBrowser

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

O controlo WebBrowser notifica o anfitrião de um erro de script não processada através da interface IOleCommandTarget . O anfitrião pode, em seguida, obter as informações sobre o erro, mostrar (ou suprimir) erro mensagem ao utilizador e opte por executar scripts na página.

Mais Informação

Quando um dos motores de script encontra um erro não processado, reencaminha o erro para o controlo WebBrowser, que consulta o respectivo contentor para ver se o contentor implementou IOleCommandTarget . Se o contentor implementou IOleCommandTarget , o controlo WebBrowser chama o método IOleCommandTarget::Exec com o ID de grupo de comandos do CGID_DocHostCommandHandler (que é definido no ficheiro Mshtmhst.h) e um ID de comando de OLECMDID_SHOWSCRIPTERROR . Se o anfitrião não devolve S_OK , MSHTML apresenta a predefinição "Ocorreu um erro nesta página" mensagem de erro.

O seguinte código ilustra a implementar uma rotina de tratamento para este ID de comando que obtém as informações de erro do modelo de objecto de documento. Este código não ilustram o tratamento de erros.

Nota : Este método não será invocado se o utilizador tiver desmarcado a caixa de verificação Desactivar depuração de scripts no separador Avançadas em Opções da Internet .
   STDMETHODIMP CMyBrowser::Exec( const GUID* pguidCmdGroup, DWORD nCmdID,
      DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )
   {

      HRESULT hr = S_OK;

      if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))
      {
         
         switch (nCmdID) 
         {
         
         case OLECMDID_SHOWSCRIPTERROR:
         {
            IHTMLDocument2*             pDoc = NULL;
            IHTMLWindow2*               pWindow = NULL;
            IHTMLEventObj*              pEventObj = NULL;
            BSTR                        rgwszNames[5] = 
                                        { 
                                           SysAllocString(L"errorLine"),
                                           SysAllocString(L"errorCharacter"),
                                           SysAllocString(L"errorCode"),
                                           SysAllocString(L"errorMessage"),
                                           SysAllocString(L"errorUrl")
                                        };
            DISPID                      rgDispIDs[5];
            VARIANT                     rgvaEventInfo[5];
            DISPPARAMS                  params;
            BOOL                        fContinueRunningScripts = true;
            int	                        i;

            params.cArgs = 0;
            params.cNamedArgs = 0;

            // Get the document that is currently being viewed.
            hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);				
            // Get document.parentWindow.
            hr = pDoc->get_parentWindow(&pWindow);
            pDoc->Release();
            // Get the window.event object.
            hr = pWindow->get_event(&pEventObj);
            // Get the error info from the window.event object.
            for (i = 0; i < 5; i++) 
            {  
               // Get the property's dispID.
               hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1, 
                       LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);
               // Get the value of the property.
               hr = pEventObj->Invoke(rgDispIDs[i], IID_NULL,
LOCALE_SYSTEM_DEFAULT,
                       DISPATCH_PROPERTYGET, &params, &rgvaEventInfo[i],
NULL, NULL);
               SysFreeString(rgwszNames[i]);
            }

            // At this point, you would normally alert the user with 
            // the information about the error, which is now contained
            // in rgvaEventInfo[]. Or, you could just exit silently.

            (*pvaOut).vt = VT_BOOL;
            if (fContinueRunningScripts)
            {
               // Continue running scripts on the page.
               (*pvaOut).boolVal = VARIANT_TRUE;
            }
            else
            {
               // Stop running scripts on the page.
               (*pvaOut).boolVal = VARIANT_FALSE;			
            } 
            break;
         }
         default:
            hr = OLECMDERR_E_NOTSUPPORTED;
            break;
         }
      }
      else
      {
         hr = OLECMDERR_E_UNKNOWNGROUP;
      }
      return (hr);
   }
				

Referências

Para obter informações adicionais sobre como implementar a interface IOleCommandTarget , consulte consulte o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/com/oin_oc_9bg4.htm (http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/com/oin_oc_9bg4.htm)
Para obter mais informações sobre como desenvolver soluções baseadas na Web para o Microsoft Internet Explorer, visite os seguintes Web sites da Microsoft:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

A informação contida neste artigo aplica-se a:
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
Palavras-chave: 
kbmt kbhowto kbwebbrowser KB261003 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 261003  (http://support.microsoft.com/kb/261003/en-us/ )
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.