建立 WMI 方法

若要建立 WMI 方法,請定義 方法的輸入和輸出參數。 輸入和輸出參數是由特殊的 WMI 系統類別 __PARAMETERS來表示。 如需詳細資訊,請參閱 呼叫方法撰寫方法提供者

本主題將討論下列各節:

在 MOF 中建立 WMI 類別方法

在 WMI 中,提供者方法通常是與類別所代表之物件相關的不同動作。 應該建立方法,而不是變更屬性的值來執行動作。 例如,您可以使用EnableDisable方法來啟用或停用Win32_NetworkAdapter所代表的網路資訊中心 (NIC) 。 雖然這些動作可以表示為讀取/寫入屬性,但建議的設計是建立方法。 或者,如果您想要讓類別顯示狀態或值,建議的方法是建立讀取/寫入屬性,而不是方法。 在 Win32_NetworkAdapter中, NetEnabled 屬性會讓配接器的狀態可見,但狀態之間的變更是由 EnableDisable 方法執行。

類別宣告可以包含一或多個方法的宣告。 您可以選擇繼承父類別的方法,或實作您自己的方法。 如果您選擇實作自己的方法,則必須宣告 方法,並以特定限定詞標記標記標記方法。

下列程式描述如何在未繼承自基類的類別中宣告方法。

宣告方法

  1. 定義類別宣告大括弧之間的方法名稱,後面接著任何限定詞。

    下列程式碼範例描述 方法的語法。

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. 完成後,請使用對 MOF 編譯器的呼叫,將 Managed 物件格式 (MOF) 程式碼插入 WMI 存放庫中。

    如需詳細資訊,請參閱 編譯 MOF 檔案

下列清單會定義方法宣告的元素。

供應商

將特定提供者連結至您的類別描述。 提供者限定詞的值是提供者的名稱,它會告訴 WMI 支援您方法的程式碼所在的位置。 提供者也應該使用 動態 限定詞標記任何具有動態實例的類別。 相反地,請勿使用 動態 限定詞來標記類別,其中包含具有 作方法的靜態實例。

實現

宣告您將實作 方法,而不是從父類別繼承方法實作。 根據預設,除非衍生類別提供實作,否則 WMI 會將父類別的實作傳播至衍生類別。 省略 作限定詞表示方法在該類別中沒有實作。 如果您重新宣告沒有 作限定詞的方法,WMI 仍假設您不會實作該方法,並在呼叫時叫用父類別方法實作。 因此,只有在您將限定詞加入或移除方法加入或移除方法時,才可重新宣告衍生類別中的方法,而不附加 作限定詞。

ReturnType

描述方法傳回的值。 方法的傳回值必須是布林值、數值、 CHARSTRINGDATETIME或架構物件。 您也可以將傳回型別宣告為 VOID,表示方法不會傳回任何內容。 不過,您無法將陣列宣告為傳回實值型別。

MethodName

定義方法的名稱。 每個方法都必須有唯一的名稱。 WMI 不允許兩個具有相同名稱和不同簽章的方法存在於一個類別或類別階層中。 因此,您也無法多載方法。

ParameterDirection

包含限定詞,描述參數是否為輸入參數、輸出參數或兩者。 請勿將同一個參數名稱多次當做輸入參數使用,或多次做為輸出參數。 如果同一個參數名稱同時出現 InOut 限定詞,則功能在概念上與在單一參數上使用 InOut 限定詞相同。 不過,使用個別宣告時,輸入和輸出參數在所有其他方面必須完全相同,包括 識別碼 限定詞的數目和類型,而且限定詞必須相同且明確宣告兩者。 強烈建議在單一參數宣告中使用 InOut 限定詞。

IDQualifier

包含可唯一識別方法中參數序列內每個參數位置的 識別碼限定詞 。 根據預設,MOF 編譯器會自動以 識別碼 限定詞標記參數。 編譯器會將第一個參數標示為 0 (零) 、第二個參數的值為 1 (一個) 等等。 如有必要,您可以在 MOF 程式碼中明確陳述識別碼順序。

ParameterType

描述方法可接受的資料類型。 您可以將參數類型定義為任何 MOF 資料值,包括陣列、架構物件或參考。 使用陣列做為參數時,請使用陣列作為未系結或明確大小。

ParameterName

包含參數的名稱。 您也可以選擇在此時定義參數的預設值。 缺少初始值的參數會保持未指派狀態。

下列程式碼範例描述參數清單和限定詞。

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] sint32 InParam);
    [Implemented] 
    void MyMethod2 ([in, id(0)] sint32 InParam, 
       [out, id(1)] sint32 OutParam);
    [Implemented] 
    sint32 MyMethod3 ([in, out, id(0)] sint32 InOutParam);
};

下列程式碼範例說明如何在 MOF 參數中使用陣列。

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk DiskParam[]);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] Win32_LogicalDisk DiskParam[32]);
};

下列程式碼範例說明如何使用架構物件做為參數和傳回值。

[Dynamic, Provider ("ProviderX")]
class MyClass
{
    [Implemented] sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk 
        DiskParam);
    [Implemented] 
    Win32_LogicalDisk MyMethod2 ([in, id(0)] string DiskVolLabel);
};

下列程式碼範例描述如何包含兩個參考:一個參考至 Win32_LogicalDisk 類別的實例,另一個則包含未知物件類型的實例。

[Dynamic, Provider("ProviderX")]
class MyClass
{
    [Implemented] 
    sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk ref DiskRef);
    [Implemented] 
    sint32 MyMethod2 ([in, id(0)] object ref AnyObject);
};

在 C++ 中建立 WMI 類別方法

下列程式描述如何以程式設計方式建立 WMI 類別方法。

以程式設計方式建立 WMI 類別方法

  1. 建立 方法所屬的類別。

    您必須先有類別,才能將 方法放在 中,才能建立 方法。

  2. 使用IWbemServices::GetObjectGetObjectAsync擷取__PARAMETERS系統類別的兩個子類別。

    使用第一個子類別來描述參數內,並使用第二個子類別來描述 out-parameters。 如有必要,您可以執行單一擷取,然後呼叫 IWbemClassObject::Clone 方法。

  3. 使用 IWbemClassObject::P ut的一或多個呼叫,將參數寫入第一個類別,並將 out 參數寫入第二個類別。

    描述方法的參數時,請觀察下列規則和限制:

    • 將 [in, out] 參數視為個別專案,其中一個位於物件中包含 in-parameters,另一個位於包含 out 參數的 物件中。

    • 除了 [in, out] 限定詞以外,其餘限定詞必須完全相同。

    • 指定 識別碼限定詞 ,從 0 (零) 開始,每個參數各一個。

      輸入或輸出參數的順序是由每個參數上的 識別碼 限定詞值所建立。 所有輸入引數都必須在任何輸出引數之前。 更新現有方法提供者時變更方法輸入和輸出參數的順序,可能會導致呼叫 方法的應用程式失敗。 在現有參數的結尾新增輸入參數,而不是在已建立的序列中插入它們。

      請務必在 識別碼 限定詞序列中保留任何間距。

    • 將傳回值放在 out 參數類別中,做為名為 ReturnValue的屬性。

      這會將 屬性識別為 方法的傳回值。 此屬性的 CIM 類型是 方法的傳回型別。 如果方法具有 void 的傳回型別,則完全沒有 ReturnValue 屬性。 此外, ReturnValue 屬性不能 有識別碼限定 符,例如 方法的引數。 將 識別碼 限定詞指派給 ReturnValue 屬性會產生 WMI 錯誤。

    • 表示 類別中屬性的任何預設參數值。

  4. 使用IWbemClassObject::P utMethod呼叫,將這兩個__PARAMETERS物件放在父類別中。

    對 PutMethod的單一呼叫可以將這兩個__PARAMETERS物件放在 類別中。

建立類別