WMI メソッドの作成

WMI メソッドを作成するには、メソッドの入力と出力のパラメーターを定義します。 入力と出力のパラメーターは、特殊な WMI システム クラス __PARAMETERS によって表されます。 詳細については、メソッドの呼び出しに関するページと「メソッド プロバイダーの記述」を参照してください。

このトピックで扱うのは以下のセクションです。

MOF での WMI クラス メソッドの作成

WMI では、プロバイダー メソッドは通常、クラスが表すオブジェクトに関連する別個のアクションです。 プロパティの値を変更してアクションを実行するのではなく、メソッドを作成する必要があります。 たとえば、Enable メソッドと Disable メソッドを使用して、Win32_NetworkAdapter によって表されるネットワーク インフォメーション センター (NIC) を有効または無効にできます。 これらのアクションは読み取り/書き込みプロパティとして表現できますが、推奨される設計は、メソッドを作成することです。 または、クラスの状態または値を表示する場合は、メソッドではなく、読み取り/書き込みプロパティを作成する方法をお勧めします。 Win32_NetworkAdapter では、NetEnabled プロパティを指定するとアダプターの状態が表示されますが、状態間の変更は、Enable メソッドまたは Disable メソッドによって実行されます。

クラス宣言には、メソッドの宣言を 1 つ以上含めることができます。 親クラスのメソッドを継承するか、独自のメソッドを実装するかを選択できます。 独自のメソッドを実装する場合は、メソッドを宣言し、メソッドに特定の修飾子タグを付ける必要があります。

次の手順では、基底クラスから継承しないクラスでメソッドを宣言する方法について説明します。

メソッドを宣言するには

  1. クラス宣言の中かっこの間にメソッドの名前を定義し、その後に任意の修飾子を付けます。

    次のコード例は、メソッドの構文の説明となっています。

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. 完了したら、MOF コンパイラを呼び出して、Managed Object Format (MOF) コードを WMI リポジトリに挿入します。

    詳細については、「MOF ファイルのコンパイル」を参照してください。

以下の一覧では、メソッド宣言の要素について明らかにします。

Provider

特定のプロバイダーをクラスの説明にリンクします。 Provider 修飾子の値はプロバイダーの名前で、メソッドをサポートするコードがどこに置かれているかを WMI に示します。 プロバイダーでは、Dynamic 修飾子を付けて、動的インスタンスを持つクラスをマークする必要もあります。 これに対して、Implemented メソッドを持つ静的インスタンスを含むクラスは、Dynamic 修飾子を使用してマークしないでください。

Implemented

親クラスからメソッドの実装を継承するのではなく、メソッドを実装することを宣言します。 WMI では既定で、派生クラスから実装が提供されない限り、親クラスの実装が派生クラスに反映されます。 Implemented 修飾子を省略すると、そのクラスではメソッドに実装がないことを示します。 Implemented 修飾子を指定せずにメソッドを再宣言した場合、WMI では引き続き、そのメソッドを実装しようとしていないと想定されて、呼び出されたときに親クラスのメソッドの実装を呼び出します。 そのため、Implemented 修飾子を付けずに派生クラス内にメソッドを再宣言することが役立つのは、メソッドに対して修飾子を追加または削除する場合のみです。

ReturnType

メソッドでどのような値を返すかを記述します。 メソッドの戻り値は、ブール値、数値、CHARSTRINGDATETIME、またはスキーマ オブジェクトである必要があります。 戻り値の型を、メソッドが何も返さないことを示す VOID として宣言することもできます。 ただし、戻り値の型として配列を宣言することはできません。

MethodName

メソッドの名前を定義します。 すべてのメソッドに一意の名前を付ける必要があります。 WMI では、1 つのクラスまたはクラス階層内に、同じ名前でシグネチャが異なる 2 つのメソッドを存在させることはできません。 そのため、メソッドをオーバーロードすることもできません。

ParameterDirection

パラメーターが入力パラメーターであるか、出力パラメーターであるか、両方であるかを記述する修飾子を格納します。 同じパラメーター名を、入力パラメーターとして複数回使用したり、出力パラメーターとして複数回使用したりしないでください。 In 修飾子と Out 修飾子の両方が、同じパラメーター名に付いている場合、機能は、概念的には 1 つのパラメーターに対して In 修飾子と Out 修飾子を使用する場合と同じです。 ただし、別個の宣言を使用する場合、入力パラメーターと出力パラメーターは、ID 修飾子の数や型など、他のすべての点でまったく同じである必要があり、修飾子は両方に対して同一かつ明示的に宣言されている必要があります。 In 修飾子と Out 修飾子は、1 つのパラメーター宣言内で使用することを強くお勧めします。

IDQualifier

メソッドのパラメーター シーケンス内で各パラメーターの位置を一意に識別する ID 修飾子を格納します。 MOF コンパイラでは、既定で自動的に、パラメーターに ID 修飾子を付けます。 コンパイラにより、最初のパラメーターには 0 (ゼロ) の値、2 番目のパラメーターには 1 の値が付けられ、この後も同様に値が付けられます。 必要に応じて、MOF コード内で ID シーケンスを明示的に指定できます。

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);
};

次のコード例は、2 つの参照を含める方法の説明となっています。1 つは Win32_LogicalDisk クラスのインスタンスへの参照で、もう 1 つは不明なオブジェクト型のインスタンスへの参照です。

[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::GetObject または GetObjectAsync を使用して、__PARAMETERS システム クラスの 2 つの子クラスを取得します。

    最初の子クラスを使用して入力パラメーターを記述し、2 番目の子クラスを使用して出力パラメーターを記述します。 必要に応じて、1 回の取得後、IWbemClassObject::Clone メソッドの呼び出しを実行できます。

  3. IWbemClassObject::P ut への呼び出しを 1 回以上使用して、入力パラメーターを最初のクラスに、出力パラメーターを 2 番目のクラスに書き込みます。

    メソッドにパラメーターを記述する際には、以下の規則と制限事項に従ってください。

    • [in, out] パラメーターは、別個のエントリとして扱います。1 つは入力パラメーターを格納するオブジェクト内の、もう 1 つは出力パラメーターを格納するオブジェクト内のエントリとしてです。

    • [in, out] 修飾子以外、残りの修飾子はまったく同じである必要があります。

    • ID 修飾子は、0 (ゼロ) から始めて、各パラメーターに 1 つ指定します。

      入力または出力パラメーターの順序は、各パラメーターの ID 修飾子の値によって確立されます。 すべての入力引数は、出力引数の前に置く必要があります。 既存のメソッド プロバイダーを更新するときにメソッドの入力と出力のパラメーターの順序を変更すると、そのメソッドを呼び出すアプリケーションが失敗する可能性があります。 新しい入力パラメーターは、既に確立されているシーケンスに挿入するのではなく、既存のパラメーターの末尾に追加します。

      ID 修飾子のシーケンスは途切れないようにしてください。

    • 戻り値は、out-parameters クラス内に、ReturnValue という名前のプロパティとして配置します。

      これによってプロパティが、メソッドの戻り値として識別されます。 このプロパティの CIM 型は、メソッドの戻り値の型です。 メソッドの戻り値の型が void の場合、ReturnValue プロパティはまったくありません。 また、ReturnValue プロパティに、メソッドの引数のような ID 修飾子を付けることはできません。 ReturnValue プロパティに ID 修飾子を割り当てると、WMI エラーが発生します。

    • プロパティの既定のパラメーター値があれば、クラス内に記述します。

  4. IWbemClassObject::PutMethod を呼び出して、両方の __PARAMETERS オブジェクトを親クラス内に配置します。

    PutMethod を 1 回呼び出せば、両方の __PARAMETERS オブジェクトをクラス内に配置できます。

クラスの作成