Wie Sie die # Import-Ausnahme auslösen Mechanismus in Visual C++ ersetzen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 175784 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Hinweis: Microsoft Visual C++ .NET 2002 und Microsoft Visual C++ .NET 2003 unterstützen sowohl das verwaltete Codemodell, das von Microsoft .NET Framework zur Verfügung gestellt wird als auch nicht verwaltete systemeigene Microsoft Windows-Codemodell. Die Informationen in diesem Artikel beziehen sich nur auf nicht verwalteten Visual C++-Code.Microsoft Visual C++ 2005 unterstützt das verwaltete Codemodell, das von Microsoft .NET Framework bereitgestellt wird und nicht verwaltete systemeigene Microsoft Windows-Codemodell.
Alles erweitern | Alles schließen

Zusammenfassung

Mit # Import Ihrer Clientanwendung erstellen führt Ausnahmebehandlung durch die Klasse _com_error Ausnahme stößt ein Wrapper für-Methode eines Objekts eine fehlgeschlagene HRESULT. Möglicherweise haben Sie Gründe für diesen Mechanismus durch eine eigene Implementierung ersetzen.

Weitere Informationen

Es gibt zwei Möglichkeiten, # Import verwenden und keinen es Ausnahmen für fehlgeschlagene HRESULTS auslösen. Der erste ist die Raw_interfaces_only-Klausel mit der # Import-Anweisung verwenden. Diese negiert jedoch einige der Vorteile von Wrapperklassen, die # Import bereitstellt.

Beim zweiten Verfahren wird Ihre eigene Implementierung für _com_raise_error, über die folgende Prototyp und die Standard-Implementierung bereitstellen:
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);
   } 
				
diese Funktion wird deklariert, aber nicht in der Datei COMDEF.H implementiert. Wenn Sie eine eigene Implementierung in einer OBJ-Datei bereitstellen, verwendet der Linker, im Gegensatz zu schalten es aus COMSUPP.LIB. _com_raise_error ist in ein eigenes COMSUPP.LIB-Objekt vorhanden, damit es leicht durch Code ersetzt werden kann.

Unten ist ein Beispiel der Implementierung des # Import Ausnahme das Auslösen Funktion:
Hinweis: Derzeit unsere Compiler eine Funktion-Ausnahmespezifikation ignoriert und die Warnung generiert:
Warnung C4290: C++-Ausnahmespezifikation ignoriert.
Nach C++ muss Whitepaper verfügt jede Deklaration einer Funktion ein Ausnahmespezifikation, alle Deklarationen, einschließlich der Definition dieser Funktion eine Ausnahmespezifikation mit den gleichen Typ-Ids aufweisen.
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 ); 
					
Dieser Code versucht, ein ADO-Verbindungsobjekt zu öffnen, ohne eine beliebige gültige Verbindungsinformationen. Durch _com_raise_error ersetzen, verhindert Sie das _com_error ausgelöst wird.

Allerdings nur, weil Sie diese Funktion ersetzt haben, müssen Sie möglicherweise weiterhin für Ausnahmen auffangen. Berücksichtigen Sie den folgende Codeausschnitt.
#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 diesem Fall Conn1 ist kein gültiges Objekt und der Schnittstellenzeiger für dieses Objekt nicht vorhanden ist NULL, was _com_raise_erro aufgerufen wird. Allerdings überladenen->-Operator-Methode wird eine null-Schnittstelle, auf denen der Compiler dann versucht, Aufrufen der Open()-Methode, wodurch eine Win32-Ausnahme zurück. Testen Conn1 für NULL zunächst vor dem Aufruf Open() würde diese Ausnahme verhindern.

Eigenschaften

Artikel-ID: 175784 - Geändert am: Samstag, 1. März 2014 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 175784
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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