Creazione di un metodo WMI

Per creare un metodo WMI, definire i parametri di input e output per il metodo . I parametri di input e output sono rappresentati da una classe di sistema WMI speciale __PARAMETERS. Per altre informazioni, vedere Chiamata di un metodo e scrittura di un provider di metodi.

In questo argomento vengono illustrate le sezioni seguenti:

Creazione di un metodo di classe WMI in MOF

In WMI i metodi del provider sono in genere azioni distinte correlate all'oggetto rappresentato dalla classe . Anziché modificare il valore di una proprietà per eseguire un'azione, è necessario creare un metodo. Ad esempio, è possibile abilitare o disabilitare un centro informazioni di rete (NIC) rappresentato da Win32_NetworkAdapter usando i metodi Enable e Disable . Sebbene queste azioni possano essere rappresentate come proprietà di lettura/scrittura, la progettazione consigliata consiste nel creare un metodo. In alternativa, se si desidera rendere visibile uno stato o un valore per la classe, l'approccio consigliato consiste nel creare una proprietà di lettura/scrittura anziché un metodo. In Win32_NetworkAdapter la proprietà NetEnabled rende visibile lo stato dell'adattatore, ma le modifiche tra gli stati vengono eseguite dai metodi Enable o Disable .

Le dichiarazioni di classe possono includere la dichiarazione di uno o più metodi. È possibile scegliere di ereditare i metodi di una classe padre o implementare i propri. Se si sceglie di implementare metodi personalizzati, è necessario dichiarare il metodo e contrassegnare il metodo con tag qualificatori specifici.

Nella procedura seguente viene descritto come dichiarare un metodo in una classe che non eredita da una classe di base.

Per dichiarare un metodo

  1. Definire il nome del metodo tra le parentesi graffe di una dichiarazione di classe, seguite da eventuali qualificatori.

    Nell'esempio di codice seguente viene descritta la sintassi per un metodo .

    [Dynamic, Provider ("ProviderName")]
    class ClassName
    {
        [Implemented] <ReturnType> <MethodName>
            ([ParameterDirection, IDQualifier] 
            <ParameterType> <ParameterName>);
    };
    
  2. Al termine, inserire il codice MOF (Managed Object Format) nel repository WMI con una chiamata al compilatore MOF.

    Per altre informazioni, vedere Compilazione di file MOF.

Nell'elenco seguente vengono definiti gli elementi della dichiarazione del metodo.

Provider

Collega un provider specifico alla descrizione della classe. Il valore del qualificatore provider è il nome del provider, che indica a WMI dove risiede il codice che supporta il metodo. Un provider deve anche contrassegnare con il qualificatore dinamico qualsiasi classe con istanze dinamiche. Al contrario, non usare il qualificatore dinamico per contrassegnare una classe che contiene un'istanza statica con metodi Implementati .

Implementato

Dichiara che verrà implementato un metodo, anziché ereditare l'implementazione del metodo dalla classe padre. Per impostazione predefinita, WMI propaga l'implementazione della classe padre a una classe derivata, a meno che la classe derivata non fornisca un'implementazione. L'omissione del qualificatore Implementato indica che il metodo non ha alcuna implementazione in tale classe. Se si redeclare un metodo senza il qualificatore Implementato , WMI presuppone comunque di non implementare tale metodo e richiama l'implementazione del metodo della classe padre quando viene chiamato. Di conseguenza, ridistribuire un metodo in una classe derivata senza associare il qualificatore Implementato è utile solo quando si aggiunge o si rimuove un qualificatore da o verso il metodo .

Returntype

Descrive il valore restituito dal metodo. Il valore restituito per un metodo deve essere un oggetto booleano, numerico, CHAR, STRING, DATETIME o schema. È anche possibile dichiarare il tipo restituito come VOID, a indicare che il metodo non restituisce nulla. Non è tuttavia possibile dichiarare una matrice come tipo valore restituito.

Methodname

Definisce il nome del metodo. Ogni metodo deve avere un nome univoco. WMI non consente l'esistenza di due metodi con lo stesso nome e firme diverse in una classe o all'interno di una gerarchia di classi. Di conseguenza, non è anche possibile eseguire l'overload di un metodo.

Parameterdirection

Contiene qualificatori che descrivono se un parametro è un parametro di input, un parametro di output o entrambi. Non usare lo stesso nome di parametro più di una volta come parametro di input o più volte come parametro di output. Se viene visualizzato lo stesso nome di parametro con i qualificatori In e Out , la funzionalità è concettualmente identica all'uso dei qualificatori In, Out su un singolo parametro. Tuttavia, quando si usano dichiarazioni separate, i parametri di input e output devono essere esattamente gli stessi in tutti gli altri aspetti, inclusi il numero e il tipo di qualificatori ID , e il qualificatore deve essere lo stesso e dichiarato in modo esplicito per entrambi. È consigliabile usare i qualificatori In, Out all'interno di una singola dichiarazione di parametro.

IDQualifier

Contiene il qualificatore ID che identifica in modo univoco la posizione di ogni parametro all'interno della sequenza di parametri nel metodo . Per impostazione predefinita, il compilatore MOF contrassegna automaticamente i parametri con un qualificatore ID . Il compilatore contrassegna il primo parametro con un valore pari a 0 (zero), il secondo parametro un valore pari a 1 (uno) e così via. Se necessario, è possibile dichiarare in modo esplicito la sequenza ID nel codice MOF.

Parametertype

Descrive il tipo di dati che il metodo può accettare. È possibile definire un tipo di parametro come qualsiasi valore di dati MOF, inclusa una matrice, un oggetto schema o un riferimento. Quando si usa una matrice come parametro, usare la matrice come non associata o con una dimensione esplicita.

Parametername

Contiene il nome del parametro. È anche possibile scegliere di definire il valore predefinito del parametro a questo punto. I parametri privi di valori iniziali rimangono non assegnati.

Nell'esempio di codice seguente vengono descritti l'elenco dei parametri e i qualificatori.

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

Nell'esempio di codice seguente viene descritto come usare una matrice in un parametro 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]);
};

Nell'esempio di codice seguente viene descritto l'utilizzo di un oggetto schema sia come parametro che come valore restituito.

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

Nell'esempio di codice seguente viene descritto come includere due riferimenti: uno a un'istanza della classe Win32_LogicalDisk e l'altro a un'istanza di un tipo di oggetto sconosciuto.

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

Creazione di un metodo di classe WMI in C++

La procedura seguente descrive come creare un metodo di classe WMI a livello di codice.

Per creare un metodo di classe WMI a livello di codice

  1. Creare la classe a cui appartiene il metodo.

    Prima di creare il metodo, è necessario disporre di una classe in cui inserire il metodo .

  2. Recuperare due classi figlio della classe di sistema __PARAMETERS usando IWbemServices::GetObject o GetObjectAsync.

    Usare la prima classe figlio per descrivere i parametri in e il secondo per descrivere i parametri out. Se necessario, è possibile eseguire un singolo recupero seguito da una chiamata al metodo IWbemClassObject::Clone .

  3. Scrivere i parametri in-parameters nella prima classe e i parametri out nella seconda classe, usando una o più chiamate a IWbemClassObject::P ut.

    Quando si descrivono i parametri a un metodo, osservare le regole e le restrizioni seguenti:

    • Considera i parametri [in, out] come voci separate, una nell'oggetto che contiene i parametri in-parameters e una nell'oggetto che contiene i parametri out.

    • Oltre ai qualificatori [in, out], i qualificatori rimanenti devono essere esattamente gli stessi.

    • Specificare i qualificatori ID , a partire da 0 (zero), uno per ogni parametro.

      L'ordine dei parametri di input o output viene stabilito dal valore del qualificatore ID per ogni parametro. Tutti gli argomenti di input devono precedere qualsiasi argomento di output. La modifica dell'ordine dei parametri di input e output del metodo durante l'aggiornamento di un provider di metodi esistente può causare l'esito negativo delle applicazioni che chiamano il metodo. Aggiungere nuovi parametri di input alla fine dei parametri esistenti anziché inserirli nella sequenza già stabilita.

      Assicurarsi di non lasciare spazi vuoti nella sequenza di qualificatore ID .

    • Inserire il valore restituito nella classe out-parameters come proprietà denominata ReturnValue.

      In questo modo la proprietà viene identificata come valore restituito del metodo . Il tipo CIM di questa proprietà è il tipo restituito del metodo . Se il metodo ha un tipo restituito void, non è disponibile alcuna proprietà ReturnValue . Inoltre, la proprietà ReturnValue non può avere un qualificatore ID come gli argomenti del metodo . L'assegnazione di un qualificatore ID alla proprietà ReturnValue genera un errore WMI.

    • Esprimere i valori predefiniti dei parametri per la proprietà nella classe .

  4. Posizionare entrambi gli oggetti __PARAMETERS nella classe padre con una chiamata a IWbemClassObject::P utMethod.

    Una singola chiamata a PutMethod può inserire entrambi gli oggetti __PARAMETERS nella classe .

Creazione di una classe