擷取錯誤碼
如同所有應用程式,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
注意
透過 「winmgmts:」 Moniker 連線到 WMI 時,Err Object (VBScript) 的 Description屬性是空的。 不過,如果您使用 SWbemLocator 進行連線,則可以使用描述。
下表列出 Err Object (VBScript) 的屬性。
屬性 | 包含 |
---|---|
說明 |
當地語系化、人類看得懂的錯誤描述。 |
Number |
WMI 腳本 API 所傳回的HRESULT。 |
來源 |
識別引發錯誤的 物件。 |
下列腳本示範如何使用 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)) { }