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