Come sostituire l'eccezione di # import genera meccanismo in Visual c ++

Traduzione articoli Traduzione articoli
Identificativo articolo: 175784 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato archiviato. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.
Nota Microsoft Visual c ++ .NET 2002 e Microsoft Visual c ++ .NET 2003 supportano sia il modello di codice gestito fornito da Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.Microsoft Visual c ++ 2005 supporta sia il modello di codice gestito fornito da Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows.
Espandi tutto | Chiudi tutto

Sommario

Utilizzo di # import per creare l'applicazione client introduce exception handling tramite la classe di eccezione _com_error quando un wrapper per il metodo di un oggetto rileva un HRESULT non riuscito. È possibile che motivi validi per sostituire questo meccanismo con la propria implementazione.

Informazioni

Esistono due modi per utilizzare # Import e non generare eccezioni per HRESULT non riuscita. Il primo consiste nell'utilizzare la clausola raw_interfaces_only con l'istruzione # import. Tuttavia, Nega alcuni dei vantaggi delle classi wrapper che fornisce # Import.

La tecnica seconda è fornendo la propria implementazione per _com_raise_error, che presenta la seguente implementazione prototipo e default:
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);
   } 
				
questa funzione è dichiarata ma non implementata nel file COMDEF.H. Se si fornisce un'implementazione personalizzata in un obj, che il linker utilizza invece di portarla da COMSUPP.LIB. in un proprio oggetto COMSUPP.LIB _com_raise_error esiste solo in modo che può essere facilmente sostituito dal codice.

Di seguito è un esempio di implementazione della funzione di generazione eccezione di # import:
Nota: Attualmente il compilatore ignora una specifica di eccezione funzione e genera l'avviso:
avviso C4290: c ++ specifica eccezione ignorata.
In base a c ++ white paper se qualsiasi dichiarazione di una funzione dispone di una specifica eccezione tutte le dichiarazioni, compresa la definizione di tale funzione deve avere una specifica di eccezione con lo stesso insieme di ID del 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 ); 
					
Il codice tenta di aprire un oggetto di connessione ADO senza fornire le informazioni di connessione valida. Sostituendo _com_raise_error è consentito il _com_error vengano generati.

Tuttavia, solo perché dopo aver sostituito questa funzione, ancora potrebbe essere necessario intercettare per le eccezioni. Si consideri il frammento di codice riportato di seguito.
#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); 
				
in questo caso, Conn1 non è un oggetto valido e il puntatore a interfaccia a questo oggetto non esistente è NULL, con conseguente _com_raise_erro chiamato. Tuttavia, l'overload-> operatore metodo restituirà un'interfaccia null, in cui il compilatore tenta quindi di richiamare il metodo Open(), generando un'eccezione Win32. Conn1 test per NULL prima di chiamata Open() impedisce a questa eccezione.

Proprietà

Identificativo articolo: 175784 - Ultima modifica: venerdì 21 febbraio 2014 - Revisione: 5.0
Le informazioni in questo articolo si applicano 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
Chiavi: 
kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 175784
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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