MOF 数组

数组是具有相同数据类型的数据值的索引列表,你可以引用这些数据值。 除了字符串和数字数组外,MOF 还支持嵌入对象和引用的数组。

以下规则定义了 MOF 数组:

  • 属性标识符后使用的括号指定类定义中的数组。

    Class ArrayDataSample1
    {
        string strArray1[];
    };
    
  • 所有数组都必须是一维数组。

  • 数组可以是无界的,也可以具有显式大小。

    Class MyClass
    {
        sint32 MyMethod1 ([in, id(0)] Win32_LogicalDisk DiskArray1[]);
        sint32 MyMethod2 ([in, id(0)] Win32_LogicalDisk DiskArray2[32]);
    };
    

    WMI 将有界和无界数组实现为 SAFEARRAY 结构,这使得 WMI 在运行时能够改变数组维度。 声明具有显式大小的数组时,WMI 会将该大小存储为限定符,并将该大小视为建议的最大大小。 但是,WMI 可在必要时扩展大小。 更改显式大小不会影响实际数据。

  • 通过在逗号分隔的列表中指定相应类型的值来初始化数组。

    Class ArrayDataSample2
    {
        [key] string s;
        string strArray2[] = {"hello", "there"};
        sint32 dwArray[] = {1,2,3};
    };
    
  • 引用数组声明为对象路径字符串数组。

    声明对象路径字符串时,不要在对象路径的元素之间放置空格。 以下示例说明如何声明对象路径引用。

    Class ClassWithRefArray
        { 
        [key] string s; 
        object ref refArray[]; 
        };
    
    instance of ClassWithRefArray
        {
        s = 23;
        refArray = {"Disk.Name=\"C:\"", "Disk.Name=\"E:\""};
        };
    
  • 可以将数组用作方法的参数,但不能用作输入或输入输出参数的返回值。

  • 数组中的所有元素都创建为相同类型的值。

    如果数组的元素属于对象类型,可以在数组中放置任何类型的对象。 另一方面,如果声明特定类型的对象,则 WMI 仅允许数组中该类或子类的对象。 以下示例演示包括使用对象类型的数组声明。

    Class EmbedClass
    {
        [key] sint32 PropOfClass;
    };
    
    Class ArrayDataClass
    {
        [key] string s;
        string strArray1[];
        string strArray2[] = {"hello", "there"};
        sint32 dwArray[] = {1,2,3};
        EmbedClass objArray[];
    };
    
    instance of ArrayDataClass
    { 
        s = "keyStuff";
        strArray1 = { "1.2.3.4", "1.2.3.5", "1.2.3.7"};
        strArray2 = 
            {
                "SELECT * FROM RegistryKeyChangeEvent",
                "SELECT * FROM RegistryValueChangeEvent",
                "SELECT * FROM RegistryTreeChangeEvent"
            };
        dwArray  = { 1,2,3,5,6 };
        objArray = {
                       instance of EmbedClass{PropOfClass=3;},
                       instance of EmbedClass{PropOfClass=4;}
                   };
    };