在 Managed 程式碼的 HRESULT 資訊
如果遇到 HRESULT 傳回值,managed 程式碼和 COM 之間的互動可能會造成問題。
在 COM 介面,HRESULT 傳回值可以扮演這些角色:
傳送錯誤的資訊 (例如, E_INVALIDARG)。
提供標準的程式行為的狀態資訊。
當 COM 呼叫 managed 程式碼時,Hresult 可能會造成這些問題:
因為許多的Visual Studio SDK COM 函數傳回 HRESULT 值小於零或傳回不同的成功碼Visual Studio SDK interop 組件已寫入保留方法簽章。 所有Visual Studio SDK interop 的方法有int型別。 HRESULT 值會通過 interop 的圖層不會有所修改,並不會產生例外狀況。
由於 COM 函數會傳回 HRESULT managed 呼叫它的方法,呼叫的方法必須檢查 HRESULT,並擲回例外狀況,必要時。
從 COM 傳回 Managed 程式碼的處理 Hresult
當您從 managed 程式碼中呼叫 COM 介面時,檢查的 HRESULT 值,而且必要時,擲回例外狀況。 ErrorHandler類別包含ThrowOnFailure方法,就會擲回 COM 例外狀況的 HRESULT 值而定,傳遞給它。
預設情況下, ThrowOnFailure就會擲回例外狀況,只要它所傳遞的 HRESULT 值,有的值小於零。 在當中這類的 Hresult 為可接受的值,而且應該擲回任何例外狀況的情況下,其他的 HRESULT 值應該傳遞至ThrowOnFailure測試值之後。 如果要測試的 HRESULT 會比對明確地傳遞至任何 HRESULT 值ThrowOnFailure,會擲回任何例外狀況。
![]() |
---|
VSConstants類別包含常數的常見的 HRESULT,比方說, S_OK和E_NOTIMPL,以及Visual Studio HRESULT,比方說, VS_E_INCOMPATIBLEDOCDATA和VS_E_UNSUPPORTEDFORMAT。VSConstants也提供Succeeded和Failed方法,它會對應到Succeeded方法以及Failed在 COM 中的巨集 |
比方說,請考慮下列的函式呼叫,其中E_NOTIMPL是可接受的傳回值,但任何其他的 HRESULT 小於零表示錯誤。
Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL);
如果有一個以上的可接受的傳回值,額外的 HRESULT 值只是附加至清單中的呼叫ThrowOnFailure。
Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL);
Com 傳回 HRESULT,從 Managed 程式碼
如果不發生任何例外狀況,managed 程式碼傳回S_OK COM 函式呼叫它。 COM interop 支援常見的例外狀況的 managed 程式碼中為強型別。 比方說,一種方法,會收到無法接受null引數擲回ArgumentNullException。
如果您不是特定的例外狀況擲回,但是您知道 HRESULT 您想要回到 COM,您可以使用ThrowExceptionForHR擲回適當的例外狀況的方法。 比方說,即使有了非標準的錯誤,運作VS_E_INCOMPATIBLEDOCDATA。 ThrowExceptionForHR嘗試將對應的 HRESULT 傳遞給它的強型別的例外狀況。 若無法移除,就會擲回一般的 COM 例外狀況代替。 最後結果是 HRESULT 您傳遞給ThrowExceptionForHR從 managed 程式碼會傳回給呼叫它的 COM 函數。
![]() |
---|
例外狀況會影響效能,用於指出程式異常的狀況。通常發生的條件應該處理的內嵌,而非擲回的例外狀況。 |