Jak nahradit výjimka #import 's zvýšení mechanismus v jazyce C++

Překlady článku Překlady článku
ID článku: 175784 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Poznámka: Microsoft Visual C++ .NET 2002 a Microsoft Visual C++ .NET 2003 podporují model spravovaný kód, který je součástí Microsoft .NET Framework a Nespravovaná nativní kód modelu Microsoft Windows. Informace v tomto článku platí pouze pro nespravované kód jazyka C++.Microsoft Visual C++ 2005 podporuje model spravovaný kód, který je součástí Microsoft .NET Framework a Nespravovaná nativní kód modelu Microsoft Windows.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Vytvoření aplikace klienta pomocí #import zavádí zpracování prostřednictvím třída výjimek _com_error, pokud narazí obálky pro metodu objektu se nezdařilo HRESULT výjimek. Pravděpodobně platný důvodů nahradit tento mechanismus s vlastní implementací.

Další informace

Existují dva způsoby použití #import a není nutné zvýšit výjimky HRESULTS se nezdařilo. První je použít klauzuli raw_interfaces_only příkazem #import. Však tato Neguje některé výhody tříd obálky, který poskytuje #import.

Druhý postup je poskytnutím vlastní implementaci _com_raise_error, která má následující prototyp a výchozí implementace:
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);
   } 
				
Tato funkce je deklarována, ale není implementována v souboru COMDEF.H. Pokud poskytují vlastní implementace .OBJ linker, který používá jako protiklad k uvedením z COMSUPP.LIB. _com_raise_error existuje v samostatném objektu COMSUPP.LIB stejně tak mohou být snadno nahrazen podle kódu.

Níže je Příklad implementace funkce zvýšení výjimka #import 's:
Poznámka: Naše kompilátor aktuálně ignoruje výjimka funkce-specifikace a generuje varování:
upozornění C4290: C++ specifikace výjimka ignorována.
Podle C++ dokument Pokud všechny deklarace funkce má výjimka specifikaci, všechny deklarace včetně definice, dané funkce vztahuje mít výjimka specifikaci sadou ID typu.
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 ); 
					
Tento kód se pokusí otevřít objekt připojení ADO bez zadání jakýchkoli informací platné připojení. Nahrazením _com_raise_error zabránila _com_error z právě aktivovaná.

Však stačí, protože jste nahradili Tato funkce může stále potřebujete soutisk pro výjimky. Zvažte fragment kódu níže.
#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); 
				
v tomto případě Conn1 není platný objekt a ukazatele rozhraní tohoto objektu neexistující není NULL, výsledkem _com_raise_erro volána. Však přetížené-> operátor metoda bude vracet null rozhraní, na kterém se kompilátor potom pokusí vyvolat metodu Open() následek výjimku Win32. Testování Conn1 NULL nejprve před voláním Open() by zabránit tuto výjimku.

Vlastnosti

ID článku: 175784 - Poslední aktualizace: 28. února 2014 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:175784

Dejte nám zpětnou vazbu

 

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