DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 177551 - Última revisão: quinta-feira, 5 de agosto de 2004 - Revisão: 3.2

 

Sumário

Quando você carregar um arquivo no Internet Explorer 4.0 que está associado com um servidor do documento ativo que está escrito na MFC, você não pode navegar fora da página atualmente carregada. Internet Explorer 4.0 será exibida para iniciar a próxima página de carregamento, o indicador de barra de progresso preencherá parte forma e o logotipo do Internet Explorer iniciará girando. No entanto, Internet Explorer 4.0 permanecerá nesse estado indefinidamente até desligamento para baixo.

Isso é causado por uma falha na implementação do MFC do IOleCommandTarget::QueryStatus. QueryStatus implementação do MFC incorretamente Especifica que IDs de comando desconhecido no momento são suporte mas desativados. Internet Explorer 4.0 usa um comando de grupo de comandos para o qual não há suporte para determinar se o servidor do documento ativo (anteriormente chamado de "Documento ActiveX") pode ser desativado. Como MFC responde incorretamente que o comando de grupo de comandos é suportado e desativado, o servidor do documento ativo nunca é descarregado.

Como solução alternativa, você deve substituir CDocObjectServer e COleCmdUI para fornecer a funcionalidade correta. (Consulte a seção mais informações para obter instruções sobre como fazer isso.)

A Microsoft confirmou este é um bug em produtos Microsoft listados no começo deste artigo. Nós estiver pesquisando esse bug e irá postar novas informações aqui na Base de dados de Conhecimento da Microsoft como ele se torna disponível.

Mais Informações

As informações a seguir descrevem as etapas para solucionar o erro é declarado acima. O exemplo AxDocFix mencionado abaixo demonstra essa solução alternativa.

Para contornar esse bug, execute estas etapas para um servidor AppWizard-criado no documento ativo básico:
  1. CDocObjectServer de substituição: Crie uma nova classe CMyDocObjectServer e derivam-publicamente CDocObjectServer. Fornecer um construtor da seguinte maneira:
          class CMyDocObjectServer : public CDocObjectServer
          {
          public:
             CMyDocObjectServer(COleServerDoc* pOwner,
                                LPOLEDOCUMENTSITE pDocSite = NULL)
                : CDocObjectServer(pOwner, pDocSite) {}
          }
    					
  2. Incluir as macros de interface necessário na definição de classe para CMyDocObjectServer:
          DECLARE_INTERFACE_MAP()
          BEGIN_INTERFACE_PART(MyOleCommandTarget, IOleCommandTarget)
             STDMETHOD(QueryStatus)(const GUID*, ULONG, OLECMD[], OLECMDTEXT*);
             STDMETHOD(Exec)(const GUID*, DWORD, DWORD, VARIANTARG*,
                             VARIANTARG*);
          END_INTERFACE_PART(MyOleCommandTarget)
    					
  3. Implementar o mapa de interface no arquivo de implementação para CMyDocObjectServer:
    BEGIN_INTERFACE_MAP(CMyDocObjectServer, CDocObjectServer)
             INTERFACE_PART(CMyDocObjectServer, IID_IOleCommandTarget,
                            MyOleCommandTarget)
          END_INTERFACE_MAP()
    					
  4. Fornecer as implementações seguintes para AddRef(), Release(), QueryInterface() e Exec():
          STDMETHODIMP_(ULONG)
               CMyDocObjectServer::XMyOleCommandTarget::AddRef()
          {
             METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
             ASSERT_VALID(pThis);
    
             return pThis->m_xOleCommandTarget.AddRef();
          }
    
          STDMETHODIMP_(ULONG)
                        CMyDocObjectServer::XMyOleCommandTarget::Release()
          {
             METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
             ASSERT_VALID(pThis);
    
             return pThis->m_xOleCommandTarget.Release();
          }
    
          STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::QueryInterface(
                REFIID iid, LPVOID* ppvObj)
          {
             METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
             ASSERT_VALID(pThis);
    
             return pThis->m_pOwner->ExternalQueryInterface(&iid, ppvObj);
          }
    
          STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::Exec(
                const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
                VARIANTARG* pvarargIn, VARIANTARG* pvarargOut)
          {
             METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
             ASSERT_VALID(pThis);
    
             return pThis-&m_xOleCommandTarget.Exec(pguidCmdGroup, nCmdID,
                                                    nCmdExecOpt, pvarargIn,
                                                    pvarargOut);
          }
    					
  5. Copie o código para QueryStatus() de mfc\src\oledoctg.cpp. Altere a assinatura para este método em MyDocObjectServer.cpp para o seguinte:
    STDMETHODIMP CMyDocObjectServer::XMyOleCommandTarget::QueryStatus(
             const GUID* pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[],
             OLECMDTEXT* pcmdtext)
          {
          ...
          }
    						
    isso altera o nome do classe aninhada do XOleCommandTarget para XMyOleCommandTarget.
  6. Alterar a chamada para METHOD_PROLOGUE_EX deste:
    METHOD_PROLOGUE_EX(CMyDocObjectServer, OleCommandTarget)
    						
    a este:
          METHOD_PROLOGUE_EX(CMyDocObjectServer, MyOleCommandTarget)
        
    					
  7. Altere a linha 18 in CDocObjectServer::XOleCommandTarget::QueryStatus (primeiro linha após a segunda instrução else) deste
    COleCmdUI state(rgCmds, cCmds, pguidCmdGroup);
    						
    para este
    CMyOleCmdUI state(rgCmds, cCmds, pguidCmdGroup);
    						
    CMyOleCmdUI é a classe derivada de COleCmdUI que você irá criar na etapa 10.
  8. Adicionar este incluir o arquivo de cabeçalho para sua classe derivada COleServerDoc:
          #include "MyDocObjectServer.h"
    						
  9. Altere a implementação padrão do GetDocObjectServer() em sua classe derivada CDocument para o seguinte:
         return new CMyDocObjectServer(this, pDocSite);
    					
  10. COleCmdUI de substituição: Crie uma nova classe CMyOleCmdUI e derivam-publicamente COleCmdUI. Substituir a função virtual DoUpdate():
          class CMyOleCmdUI : public COleCmdUI
          {
           public:
             CMyOleCmdUI(OLECMD* rgCmds, ULONG cCmds, const GUID* pGroup)
                : COleCmdUI(rgCmds, cCmds, pGroup)
             {
             }
    
             virtual BOOL DoUpdate(CCmdTarget* pTarget, BOOL
                                   bDisableIfNoHandler);
          };
  11. Adicionar este incluir a instrução para MyDocObjectServer.cpp:
          #include "MyOleCmdUI.h"
    					
  12. Recortar e colar a implementação de DoUpdate() de Mfc\Src\Oledoctg.cpp (linha # 64 no Visual C++ 5.0.) Alterar esse código em seu CMyOleCmdUI::DoUpdate:
          if (bDisableIfNoHandler && !m_bEnableChanged)
          {
             AFX_CMDHANDLERINFO info;
             info.pTarget = NULL;
             bResult = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);
    
             Enable(bResult);
             if (bResult || m_bEnableChanged)
                m_rgCmds[m_nIndex].cmdf |= OLECMDF_SUPPORTED;
             else
                m_rgCmds[m_nIndex].cmdf &= ~OLECMDF_SUPPORTED;
          }
    						
    a este:
          if (bDisableIfNoHandler && !m_bEnableChanged)
          {
             AFX_CMDHANDLERINFO info;
             info.pTarget = NULL;
             bResult = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);
    
             if (bResult || m_bEnableChanged)
                m_rgCmds[m_nIndex].cmdf |= OLECMDF_SUPPORTED;
             else
                m_rgCmds[m_nIndex].cmdf &= ~OLECMDF_SUPPORTED;
             Enable(bResult);
          }
    						
    isso altera a ordem na qual ativar é chamada.
  13. Adicionar este incluir a instrução para o arquivo de implementação CMyDocObjectServer:
          #include "afxconv.h"
    						
    e adicionar este incluir a instrução para o arquivo de implementação CMyOleCmdUI:
          #include <afxpriv.h>
    					
Afxpriv.h é necessário para implementação do mecanismo de roteamento de comando do CMyOleCmdUI no DoUpdate() adequada. Observação: Código que requer Afxpriv.h não garantido trabalho corretamente em futuras versões do Visual C++ e com futuras versões da DLL do MFC. Entretanto, como esta é a única solução para o erro descrito neste artigo, uso de Afxpriv.h não pode ser evitado. Depois de uma versão futura do MFC tenha corrigido esse bug, essa solução alternativa deve ser removida do seu código.

Um servidor de documento ativo do MFC padrão que tenha essas correções aplicadas está disponível para download. Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:
Axdocfix.exe (http://download.microsoft.com/download/ie4095/axdocfix/1/win98/en-us/axdocfix.exe)
Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

A informação contida neste artigo aplica-se a:
  • Microsoft Internet Explorer 4.0 Edição de 128 Bits
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Palavras-chave: 
kbmt kbdownload kbfile kbinfo kbsample KB177551 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 177551  (http://support.microsoft.com/kb/177551/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store