擷取錯誤碼
如同所有應用程式,WMI 會從 Windows作系統接收錯誤碼。
當您收到錯誤碼時,您有下列選項:
查看事件記錄檔。
WMI 會將錯誤訊息傳送至事件記錄服務,以檢查事件記錄檔,以協助判斷錯誤的原因。 您可以使用 事件記錄檔 提供者支援的類別,以程式設計方式存取事件記錄檔。
通常正常擷取錯誤碼。
WMI 支援標準技術來擷取錯誤碼,這些錯誤碼是C++的 COM 錯誤碼,以及原生錯誤物件,例如 Err 物件 (VBScript),或如果提供者提供錯誤資訊,SWbemLastError。
如需詳細資訊,請參閱 操作類別和實例信息。
本主題將討論下列各節:
使用 VBScript 處理錯誤
如果透過 WMI 的文稿 API 呼叫 WMI 會造成錯誤,您有下列選項可存取錯誤資訊:
- 例如,在 VBScript 中使用腳本語言的原生錯誤機制,使用 Err 物件 (VBScript) 來支持錯誤處理。
- 建立 SWbemLastError 物件以取得錯誤報告。
下列文稿示範如何使用原生 Err 物件 (VBScript)。 當指定了不正確的進程句柄值時,會產生錯誤。
On Error Resume Next
Set objProcess = GetObject( _
"winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number
注意
Err 物件 (VBScript) 的 Description 属性在透過 “winmgmts:” moniker 連線到 WMI 時是空的。 不過,如果您使用 SWbemLocator進行連線,則描述可用。
下表列出 Err 物件 (VBScript)的屬性。
財產 | 包含 |
---|---|
描述 |
當地語言化,且人類可讀的錯誤描述。 |
號碼 |
HRESULT 由 WMI 的腳本 API 傳回。 |
來源 |
識別引發錯誤的物件。 |
下列腳本示範如何使用 SWbemLastError 物件來取得詳細的錯誤資訊。 請注意,並非所有提供者都會提供資訊給 SWbemLastError。 如需文稿中錯誤碼的詳細資訊,請參閱 WbemErrorEnum。
On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
& LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName
使用 C++ 處理錯誤
WMI 用戶端應用程式可以接收 COM 特定或 WMI 特定錯誤。 COM 錯誤符合 COM 錯誤碼的結構。 除了 IWbemContext、IWbemClassObject和 IWbemQualifierSet 介面之外,所有 WMI 介面都可以傳回 COM 特定的錯誤。 如需 COM 錯誤碼的詳細資訊,請參閱 錯誤處理。 WMI 介面的參考頁面會在 [錯誤碼] 區段中列出適當的 WMI 錯誤碼。
用戶端應用程式必須遵循 COM 標準,以檢查狀態和錯誤傳回碼。 您必須選擇的主要差異是您想要從同步、半同步或異步呼叫擷取錯誤碼。
使用C++ 存取同步和半同步錯誤訊息
使用呼叫 getErrorInfo COM 函式來擷取錯誤資訊。
請務必在介面方法指出錯誤之後立即呼叫 GetErrorInfo。 這包括您在處理半異步程式時呼叫的任何 IWbemCallResult 方法。
檢查傳回的 COM 錯誤物件,並呼叫 IErrorInterface::QueryInterface 方法。
請務必為 QueryInterface 呼叫中的 riid 參數指定IID_WbemClassObject。 QueryInterface 方法會傳回 WMI 類別的實例,通常 __ExtendedStatus。
WMI 不會透過 getErrorInfo 傳遞錯誤對象,因為無法知道異步呼叫發生的時間或線程。 因此,您的程式代碼只能處理特定錯誤,或透過 COM 傳遞呼叫失敗。
注意
由於對接收端的回呼可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步,而不是異步通訊。 如需詳細資訊,請參閱 呼叫 方法。
使用C++ 存取異步錯誤訊息
從你的 實作中擷取 IWbemObjectSink::SetStatus的 COM 錯誤物件。
下列虛擬程式代碼顯示用戶端應用程式的典型錯誤處理實作。
HRESULT hRes = SomeMethod; // Check for specific error and status codes. if (hRes == WBEM_E_NOT_FOUND) { // Processing to handle specific error code } else if hRes == WBEM_S_DUPLICATE_OBJECTS { // All other cases, including errors specific to COM } else if (FAILED(hRes)) { }