如何更換 # import 的例外狀況引發 Visual C++ 中的機制

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:175784
本文已封存。本文係以「現狀」提供且不會再更新。
附註 Microsoft Visual C++.NET 2002年和 Microsoft Visual C++.NET 2003年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。Microsoft Visual C++ 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 ) throw(_com_error)   {       throw _com_error(hr, perrinfo);   } 				
這個函式宣告但未實作 COMDEF.H 檔案中。如果您提供的一個.OBJ 中您自己實作連結器會使用的相對於從 COMSUPP.LIB 帶。_com_raise_error 存在 COMSUPP.LIB 自己物件,只是讓您的程式碼可以輕易地更換。

下面是實作的 # import 的例外狀況引發函式的範例:
附註:目前我們編譯器會忽略以函式的例外狀況規格,並會產生警告訊息:
警告 C4290: C + + 例外狀況規格被忽略。
根據以 C + + 白皮書如果任何函式的宣告有一個例外狀況規格,包括定義的所有宣告該函式的都應該有與相同型別識別碼組的例外狀況規格。
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 ); 					
這個程式碼會嘗試開啟 ADO 連線物件,但未提供任何有效的連接資訊。藉由取代 _com_raise_error,您可以防止 _com_error 從引發。

不過,只是因為您已經取代此函式,您可能仍然需要設陷例外狀況。請考慮下列程式碼片段。
#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); 				
在這種情況下 Conn1 不是有效的物件,而介面指標,以這個不存在物件是導致 _com_raise_erro 被呼叫的 NULL。 -不過,多載 > 運算子方法會傳回編譯器接著嘗試叫用 Open() 方法導致一個 Win32 例外狀況在其一個 null 介面。為 NULL 呼叫 Open() 之前先測試 Conn1 會防止這個例外狀況。

內容

文章識別碼:175784 - 最後檢閱時間:03/01/2014 12:59:21 - 修訂: 5.0

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

  • kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtzh
意見反應