Como substituir a exceção do # Import aumentando mecanismo no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 175784 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Observação Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 oferecem suporte o modelo de código gerenciado fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.Microsoft Visual C++ 2005 oferece suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado.
Expandir tudo | Recolher tudo

Sumário

Usando o # import para criar seu aplicativo cliente apresenta manipulação através da classe de exceção _com_error quando um wrapper para um método do objeto encontra uma falha HRESULT de exceções. Talvez você tenha motivos válidos para substituir esse mecanismo por sua própria implementação.

Mais Informações

Há duas maneiras usar # Import e não geram exceções para HRESULTS falhou. A primeira é usar a cláusula raw_interfaces_only com a instrução # import. No entanto, isso anula algumas das vantagens das classes de wrapper # Import fornece.

A segunda técnica é fornecendo sua própria implementação para _com_raise_error, que tem a seguinte implementação de protótipo e padrão:
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 está declarada mas não implementada no arquivo COMDEF.H. Se você fornecer sua própria implementação de um .obj, o vinculador usa que em oposição a trazendo-de COMSUPP.LIB. _com_raise_error existe no seu próprio objeto COMSUPP.LIB para que ele pode ser substituído facilmente pelo seu código.

Abaixo é um exemplo de implementação da função de geração de exceção do # Import:
Observação: No momento nosso compilador ignora uma exceção especificação de função e gera o aviso:
Aviso C4290: C++ especificação exceção ignorado.
Acordo com a C++ white paper se qualquer declaração de uma função tem uma exceção-especificação, todas as declarações, incluindo a definição dessa função deverá ter uma especificação de exceção com o mesmo conjunto de identificações de tipo de.
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 ); 
					
Esse código tenta abrir um objeto de conexão ADO sem fornecer quaisquer informações de conexão válida. Substituindo _com_raise_error, você impediu o _com_error sendo gerado.

No entanto, apenas porque você ter substituído essa função, talvez você ainda precise ajusta o registro de exceções. Considere o trecho de código a seguir.
#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); 
				
Conn1 não é um objeto válido nesse caso, e o ponteiro de interface para este objeto não existente for NULL, resultando em _com_raise_erro sendo chamado. No entanto, o sobrecarregado-> operador método retornará uma interface nula, em que o compilador, em seguida, tenta chamar o método Open(), resultando em uma exceção do Win32. Teste Conn1 para NULL primeiro antes de chamar Open() impediria que essa exceção.

Propriedades

ID do artigo: 175784 - Última revisão: sábado, 22 de fevereiro 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 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: 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