Como substituir excepção do #import aumentar mecanismo no Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 175784 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Nota Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.Microsoft Visual C++ 2005 suporta o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido.
Expandir tudo | Reduzir tudo

Sumário

Utilizar #import para criar a aplicação de cliente apresenta a excepção a processar a classe de excepção _com_error quando um wrapper para método um objecto encontra um HRESULT falhou. Poderá ter motivos válidos para substituir este mecanismo de implementação do próprio.

Mais Informação

Existem duas formas de utilizar #import e não tem-aumentar excepções para HRESULTS falhou. A primeira consiste em utilizar a cláusula raw_interfaces_only com a instrução #import. No entanto, isto nega algumas das vantagens das classes de mensagens publicitárias #import fornece.

A segunda técnica consiste em fornecer a suas próprias implementação para _com_raise_error, que tem a seguinte implementação protótipo e predefinido:
void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0)
   throw(_com_error);

   void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo ) throw(_com_error)
   {
       throw _com_error(hr, perrinfo);
   } 
				
esta função é declarada mas não implementada no ficheiro COMDEF.H. Se fornecer implementação de um .OBJ, o linker utiliza que por oposição a colocar de COMSUPP.LIB. _com_raise_error existe no seu próprio objecto na COMSUPP.LIB apenas para que possa ser facilmente substituído pelo código.

Segue-se um exemplo de implementação excepção raising função do #import:
NOTA: Actualmente o compilador ignora uma especificação de excepção de função e gera o aviso:
aviso C4290: C++ especificação excepções ignoradas.
Acordo com a C++ documentação técnica se qualquer declaração de uma função tiver uma excepção-especificação, todas as declarações, incluindo a definição de função do deverá ter uma especificação de excepção com o mesmo conjunto de ID de tipo.
void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo ) throw(_com_error)
       {
           //this message box is for demonstration purpose only
          AfxMessageBox( "_com_raise_error (HRESULT, IErrorInfo*)" );
           //your own error handling code or just an abort
       }
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF" )

       _bstr_t     bstrEmpty(L"");
       _ConnectionPtr  Conn1 = NULL;
       Conn1.CreateInstance( __uuidof( Connection ) );
       Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty,0 ); 
					
Este código tenta abrir um objecto de ligação ADO sem fornecer quaisquer informações de ligação válida. Substituindo _com_raise_error, impediu o _com_error de ser aumentado.

No entanto, apenas uma vez que tiver substituído esta função, ainda ser necessário aplicar um véu para excepções. Considere o fragmento de código abaixo.
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF" )
    _ConnectionPtr  Conn1 = NULL;
    // Conn1.CreateInstance( __uuidof( Connection ) );
    Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty ,0); 
				
neste caso, Conn1 não é um objecto válido e o apontador de interface para este objecto inexistente é NULL, resultando em _com_raise_erro ser chamado. No entanto, o sobrecarregado-> operador método devolverá uma interface nulo, no qual o compilador em seguida, tenta invocar o método Open(), resultando numa excepção de Win32. Teste Conn1 para NULL primeiro antes de chamar Open() iria impedir esta excepção.

Propriedades

Artigo: 175784 - Última revisão: 1 de março de 2014 - Revisão: 5.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtpt
Traduçã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: 175784

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com