从旧属性创建新实例

联接视图类包含来自源类实例的属性,这些实例通过公共属性值连接,例如 Class1.Prop1 = Class2.Prop2。 联接视图类中的每个实例都由不同类实例的部分组成。

可以基于属性值的不等式来创建联接视图类,例如 Class1.Prop1<>Class2.Prop2,其中 Prop1 和 Prop2 未映射到视图类中的相同属性。

当要查找的信息包含在单独但相关的类中时,联接视图类很有用。 例如,如果需要有关打印机和打印机配置的信息,可以创建一个联接视图类,其中包含 Win32_Printer 类的一些属性和 Win32_PrinterConfiguration 类的一些属性。 如果没有视图提供程序,则必须检索并合并单独实例的属性才能获得所需的信息。

以下过程描述如何创建联接试图类。

创建联接视图类

  1. 使用 JoinOn 字符串限定符开始类定义。

    限定符 JoinOn、Association 和 Union 互斥。

  2. 如有必要,请通过应用 PostJoinFilter 限定符筛选要在联接类中使用的实例。

    使用 PostJoinFilter 提供程序,你可以将视图类的实例限制为满足特定条件的实例。

  3. 使用 ViewSources 限定符创建定义视图类的源实例的查询。

  4. 使用 ViewSpaces 限定符定义源实例所在的命名空间的名称和位置。

  5. 使用 PropertySources 限定符在联接视图类中定义所需的属性。

    当基于相等性将属性添加到联接视图时,必须在一个 PropertySources 限定符中映射这两个源属性。

    以下代码示例显示了在一个 PropertySources 限定符中映射的两个属性。

    [PropertySources{"IDProcess", "IDProcess"}] Uint32 ProcessID;
    

    通过使用 HiddenDefault 限定符,你可以标记属于源类的属性。

以下代码示例显示了从性能监视器提供程序类 Win32_PerfRawData_PerfProc_ProcessWin32_PerfRawData_PerfProc_Thread 创建的联接视图类,这两个类的属性由 ProcessID 属性进行联接。

#pragma namespace("\\\\.\\root\\cimv2")

instance of __Win32Provider as $DataProv
{
    Name = "MS_VIEW_INSTANCE_PROVIDER";
    ClsId = "{AA70DDF4-E11C-11D1-ABB0-00C04FD9159E}";
    ImpersonationLevel = 1;
    PerUserInitialization = "True";
    
};

instance of __InstanceProviderRegistration
{
    Provider = $DataProv;
    SupportsPut = True;
    SupportsGet = True;
    SupportsDelete = True;
    SupportsEnumeration = True;
    QuerySupportLevels = {"WQL:UnarySelect"};
};

[JoinOn("Win32_PerfRawData_PerfProc_Process.IDProcess = 
    Win32_PerfRawData_PerfProc_Thread.IDProcess"), 
ViewSources{"SELECT Name, IDProcess, PriorityBase 
    FROM Win32_PerfRawData_PerfProc_Process", 
    "SELECT Name, IDProcess, ThreadState, 
    PriorityCurrent FROM Win32_PerfRawData_PerfProc_Thread"},
ViewSpaces{"\\\\.\\root\\cimv2", "\\\\.\\root\\cimv2"},
dynamic: ToInstance, provider("MS_VIEW_INSTANCE_PROVIDER")]

class JoinedProcessThread
{
    [PropertySources{"IDProcess", "IDProcess"}] 
        Uint32 ProcessID;
    [PropertySources{"Name", ""}] 
        String PName;
    [PropertySources{"", "Name"}, key]   
        String TName;
    [PropertySources{"", "ThreadState"}] 
        Uint32 State;
    [PropertySources{"PriorityBase", ""}] 
        Uint32 BasePriority;
    [PropertySources{"", "PriorityCurrent"}] 
        Uint32 CurrentPriority;    
};