使用 C++ 建立和宣告實例

您可以透過 IWbemServices 介面在 C++ 中建立實例。

本主題中的程式碼範例需要下列 #include 語句才能正確編譯。

#include <wbemidl.h>

下列程式描述如何建立現有類別的實例。

建立現有類別的實例

  1. 呼叫 IWbemServices::GetObjectIWbemServices::GetObjectAsync 方法,以擷取現有類別的定義。

    下列程式碼範例示範如何使用GetObject 和 GetObjectAsync方法來取得IWbemClassObject介面的指標,以提供類別定義的存取權。

    // The pSv variable is of type IWbemServices *
    
    IWbemClassObject *pNewInstance = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;
    
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                  &pExampleClass, &pResult);
    SysFreeString(PathToClass);
    
  2. 呼叫 IWbemClassObject::SpawnInstance 方法來建立新的實例。

    下列程式碼範例示範如何建立新的實例,然後釋放 類別。

    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more
    
  3. 呼叫 IWbemClassObject::P ut 方法,以設定未繼承類別所定義值的任何屬性的值。

    類別的每個實例都會繼承為 類別定義的所有屬性。 不過,如果您選擇的話,可以指定不同的屬性值。

    如果現有的類別具有索引鍵屬性,您應該將 屬性設定為 Null 或保證的唯一值。 如果您將金鑰設定為 Null ,且索引鍵是字串, 則 PutInstanceAsyncPutInstance 會在內部產生並指派 GUID 給金鑰。 如此一來,指定索引鍵屬性的 Null 可讓您建立不會覆寫任何先前實例的唯一實例。

    下列程式碼範例示範如何設定範例實例類別的 Index 屬性值。

    VARIANT v;
    VariantInit(&v);
    
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");
    
    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);
    
  4. 透過呼叫 IWbemClassObject::GetQualifierSet來設定任何相關限定詞的值。

    GetQualifierSet方法會傳回IWbemQualifierSet介面的指標,該介面會用來存取類別或實例的限定詞。 如果類別限定詞類別為 EnableOverride,您可以為類別定義的限定詞指定不同的值。 您無法修改或刪除類別限定詞,並將類別限定詞設定為 DisableOverride。 如需詳細資訊,請參閱 限定詞類別

    您也可以選擇為實例類別定義其他限定詞。 您可以為不需要出現在類別宣告中的實例或實例屬性定義其他限定詞。

  5. 呼叫 IWbemServices::P utInstanceIWbemServices::P utInstanceAsync 方法來儲存實例。

    WMI 會將實例儲存在目前的 WMI 命名空間中。 因此,實例的完整路徑取決於命名空間,這通常是 root\default。 在此程式碼範例中,完整路徑名稱會是 \\.\root\default:Example.Index=「IX100」。

    下列程式碼範例示範如何儲存實例。

        hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
        pNewInstance->Release();
    

將實例儲存至 WMI 會鎖定實例的數個屬性。

具體而言,您無法在 WMI 基礎結構記憶體在實例之後,透過 WMI API 執行下列任何作業:

  • 變更實例所屬類別的父類別。
  • 新增或移除屬性。
  • 變更屬性類型。
  • 新增或移除 索引鍵索引 限定詞。
  • 新增或移除 SingletonDynamicAbstract 限定詞。

下列程式碼範例結合了上一個程式所討論的程式碼範例,示範如何使用 WMI API 建立實例。

void CreateInstance (IWbemServices *pSvc)
{
    IWbemClassObject *pNewInstance = 0;
    IWbemClassObject *pExampleClass = 0;
    IWbemContext *pCtx = 0;
    IWbemCallResult *pResult = 0;

    // Get the class definition.
    BSTR PathToClass = SysAllocString(L"Example");
    HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, 
                 &pExampleClass, &pResult);
    SysFreeString(PathToClass);

    if (hRes != 0)
       return;

    // Create a new instance.
    pExampleClass->SpawnInstance(0, &pNewInstance);
    pExampleClass->Release();  // Don't need the class any more

    VARIANT v;
    VariantInit(&v);

    // Set the Index property (the key).
    V_VT(&v) = VT_BSTR;
    V_BSTR(&v) = SysAllocString(L"IX100");

    BSTR KeyProp = SysAllocString(L"Index");
    pNewInstance->Put(KeyProp, 0, &v, 0);
    SysFreeString(KeyProp);
    VariantClear(&v);

    // Set the IntVal property.
    V_VT(&v) = VT_I4;
    V_I4(&v) = 1001;  
    
    BSTR Prop = SysAllocString(L"IntVal");
    pNewInstance->Put(Prop, 0, &v, 0);
    SysFreeString(Prop);
    VariantClear(&v);    
    
    // Other properties acquire the 'default' value specified
    // in the class definition unless otherwise modified here.

    // Write the instance to WMI. 
    hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
    pNewInstance->Release();
}