Visual C++ düzeneği yükseltme alma'nın özel durumu değiştirme

Makale çevirileri Makale çevirileri
Makale numarası: 175784 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Not Microsoft Visual C++ .NET 2002 ve Visual C++ .NET 2003, Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kod uygulanır.Microsoft Visual C++ 2005, Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler.
Hepsini aç | Hepsini kapa

Özet

Istemci uygulamanızın oluşturmak için alma kullanarak, özel durum nesne yöntemi için bir sarmalayıcı başarısız bir HRESULT karşılaştığında _com_error özel durum sınıfı aracılığıyla işleme tanıtır. Bu mekanizma, kendi uygulama ile değiştirmek için geçerli nedenleri olabilir.

Daha fazla bilgi

Alma ve yüklü başarısız HRESULTS için özel durumlar oluşturmak, iki yolu vardır. Ilk raw_interfaces_only yan tümcesi alma deyimiyle kullanmaktır. Ancak, bu alma sağlayan bir sarmalayıcı sınıfları avantajlarından bazıları olumsuzlar.

Kendi uygulamanız için aşağıdaki prototip ve varsayılan uygulaması olan _com_raise_error sağlayarak, ikinci yöntem ise:
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);
   } 
				
bu işlev bildirilen ancak COMDEF.H dosyasında uygulanmadı. Kendi uygulamanızda bir .OBJ sağlarsanız, the linker, karşıt olarak COMSUPP.LIB getirme kullanır. yalnızca, kolaylıkla kodunuz tarafından değiştirilebilir; böylece kendi COMSUPP.LIB nesnesinde _com_raise_error bulunmaktadır.

Aşağıda, uygulama'alma [NULL]'ın özel durum yükseltmeyi fonksiyonunun örneğidir:
Not: Şu anda bizim derleyici, bir işlev özel durum belirtimi yok sayar ve uyarı oluşturur:
C4290 Uyarı: C++ özel durum belirtimi yoksayıldı.
Bir işlevin her bildirimi bir özel durum belirtimi, tanımı, dahil olmak üzere, tüm bildirimlerden sahipse, göre C++ teknik inceleme bu işlevi, aynı tür kimlikleri kümesini içeren bir özel durum belirtimi sahip.
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 ); 
					
Bu kod, herhangi bir geçerli bağlantı bilgilerini girmeden bir ADO bağlantı nesnesi açmak çalışır. _Com_raise_error değiştirerek, _com_error yükseltilmiş engelledi.

Bu işlev yalnızca değiştirdiyseniz, ancak, yine de için özel durumları yakalamak gereksiniminiz olabilir, çünkü. Kod parçacığının göz önünde bulundurun.
#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); 
				
Böyle bir durumda, Conn1 geçerli bir nesne değil ve bu varolmayan bir nesneye arabirim işaretçisi çağrılan _com_raise_erro kaynaklanan bir NULL. Ancak, fazla yüklenmiş işleç-> yöntemi, derleyici sonra bir Win32 durum kaynaklanan Open yöntemi çağırma girişiminde, boş bir arabirimi döndürecektir. Bu durum, Open'ı çağırmadan önce ilk BOş için sınama Conn1 engeller.

Özellikler

Makale numarası: 175784 - Last Review: 21 Şubat 2014 Cuma - Gözden geçirme: 5.0
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir: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