共用方式為


建立 WMI 方法

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

本主題將討論下列各節:

在MOF中建立 WMI 類別方法

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

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

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

宣告一個方法

  1. 在類別宣告的大括弧之間定義方法名稱,並在後面加入任何限定符。

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

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

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

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

提供者

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

實作

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

ReturnType

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

方法名稱

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

參數方向

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

IDQualifier

包含 ID 限定符,可唯一識別方法中參數序列中每個參數的位置。 預設情況下,MOF 編譯程式會自動使用 ID 限定符標記參數。 編譯程式會將第一個參數標示為 0 (零),第二個參數值為 1 (一),依此標示。 如有必要,您可以在MOF程式代碼中明確陳述標識碼順序。

參數類型

描述方法可以接受的數據類型。 您可以將參數類型定義為任何MOF資料值,包括陣列、模式物件或參考。 使用陣列作為參數時,請使用無邊界或具有明確大小的陣列。

參數名稱

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

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

[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 系統類別的兩個子類別。

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

  3. 使用一或多次調用 IWbemClassObject::Put,將輸入參數寫入第一個類別,並將輸出參數寫入第二個類別。

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

    • 將 [in, out] 參數視為個別項目,一個在包含輸入參數的物件中,另一個在包含輸出參數的物件中。

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

    • 指定 識別碼 限定符,從 0 開始,每個參數各指定一個。

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

      請務必在 的標識碼 的限定符的序列中不要留下任何間距。

    • 將傳回值放在 out 參數類別 (out-parameters class) 中,作為名為 ReturnValue 的屬性

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

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

  4. 將這兩個 __PARAMETERS 物件使用呼叫 IWbemClassObject::PutMethod放入父類別。

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

建立類別