如何更換引發機制的 ActiveX 資料物件 (ADO) 在 Visual C++ 中的 # import 的例外狀況

文章翻譯 文章翻譯
文章編號: 177425 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
附註 Microsoft Visual C++.NET 2002年和 Microsoft Visual C++.NET 2003年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。Microsoft Visual C++.NET 2005年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 以及未受管理的原生 Microsoft Windows 程式碼模型。
全部展開 | 全部摺疊

在此頁中

結論

使用 # import 陳述式來建立您的用戶端應用程式引入的例外處理透過 _com_error 例外狀況類別,當物件的方法的包裝函式遇到失敗的 HRESULT。您可能有有效的理由,以取代您自己的實作這項機制。

其他相關資訊

有兩種方式使用 # import 並沒有它引發失敗 HRESULTS 的例外狀況。第一種是只要使用 raw_interfaces_only 子句使用 # import 陳述式。不過,這可以取消部份 # import 提供的包裝函式類別的優點。

第二種技巧是藉由提供 _com_raise_error 具有下列的原型和預設實作您自己實作:

   void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0)
   throw(_com_error);

   void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0) throw(_com_error)
   {
       throw _com_error(hr, perrinfo);
   }
				
這個函式宣告,但未實作 Comdef.h 檔案中。如果您提供的您自己的實作.OBJ 檔案中連結器會使用相對於從 Comsupp.lib 檔案帶該實作。 _com_raise_error 存在自己 Comsupp.lib 檔案中的物件,因此您的程式碼可以輕易地更換。

下列是 # import 的例外狀況引發函式的實作範例。

注意: 目前編譯器會忽略以函式的例外狀況規格,並會產生下列警告:

警告 C4290: 忽略的 C + + 例外狀況規格。
這次的例外狀況規格的實作詳細資料有標準化不被和接受但未在 Microsoft Visual C++ 中實作。 忽略例外狀況規格與編譯的程式碼可能需要重新編譯並連結至支援例外狀況規格的未來版本中重複使用。 您可以使用警告 Pragma 來避免這個警告:

#pragma warning( disable : 4290 ) 
				

範例程式碼

   void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0) 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 <msado15.dll>
        ...


     _bstr_t     bstrEmpty(L"");
     _ConnectionPtr  Conn1 = NULL;
     Conn1.CreateInstance( __uuidof( Connection ) );
     Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty );

				
這段程式碼會嘗試開啟 ActiveX 資料物件 (ADO) 連接物件,但未提供任何有效的連接資訊。取代 _com_raise_error 可防止 _com_error 引發。

屬性

文章編號: 177425 - 上次校閱: 2014年2月22日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbhowto kbcompiler kbdatabase kbinfo kbmdacnosweep KB177425 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:177425
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

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