从旧属性创建新实例
联接视图类包含来自源类实例的属性,这些实例通过公共属性值连接,例如 Class1.Prop1 = Class2.Prop2。 联接视图类中的每个实例都由不同类实例的部分组成。
可以基于属性值的不等式来创建联接视图类,例如 Class1.Prop1<>Class2.Prop2,其中 Prop1 和 Prop2 未映射到视图类中的相同属性。
当要查找的信息包含在单独但相关的类中时,联接视图类很有用。 例如,如果需要有关打印机和打印机配置的信息,可以创建一个联接视图类,其中包含 Win32_Printer 类的一些属性和 Win32_PrinterConfiguration 类的一些属性。 如果没有视图提供程序,则必须检索并合并单独实例的属性才能获得所需的信息。
以下过程描述如何创建联接试图类。
创建联接视图类
使用 JoinOn 字符串限定符开始类定义。
限定符 JoinOn、Association 和 Union 互斥。
如有必要,请通过应用 PostJoinFilter 限定符筛选要在联接类中使用的实例。
使用 PostJoinFilter 提供程序,你可以将视图类的实例限制为满足特定条件的实例。
使用 ViewSources 限定符创建定义视图类的源实例的查询。
使用 ViewSpaces 限定符定义源实例所在的命名空间的名称和位置。
使用 PropertySources 限定符在联接视图类中定义所需的属性。
当基于相等性将属性添加到联接视图时,必须在一个 PropertySources 限定符中映射这两个源属性。
以下代码示例显示了在一个 PropertySources 限定符中映射的两个属性。
[PropertySources{"IDProcess", "IDProcess"}] Uint32 ProcessID;
通过使用 HiddenDefault 限定符,你可以标记属于源类的属性。
以下代码示例显示了从性能监视器提供程序类 Win32_PerfRawData_PerfProc_Process 和 Win32_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;
};