共用方式為


使用 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::Put 方法,以設定任何未繼承類別所定義之值的屬性的值。

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

    如果現有的類別具有索引鍵屬性,您應該將屬性設定為 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::PutInstanceIWbemServices::PutInstanceAsync 方法來儲存實例。

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

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

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

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

具體來說,在 WMI 基礎結構中存在實例之後,您無法透過 WMI API 執行下列任何作業:

  • 變更 實例所屬類別的父類別。
  • 新增或移除屬性。
  • 變更屬性類型。
  • 新增或移除 索引鍵索引鍵 的限定符。
  • 新增或移除 單例動態抽象 限定符。

下列程式代碼範例結合上一個程式中討論的程式代碼範例,示範如何使用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();
}