如何检索相关的 PnP 对象 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题介绍如何查找彼此相关的即插即用 (PnP) 对象。 例如,你可能想要检索与设备信息对象相关的设备容器对象。 设备容器表示用户看到的物理设备。设备容器允许你访问与整个设备硬件产品有关的信息,而不只是它的一个工作接口。设备容器属性的示例为制造商或型号名称。

了解 PnP 对象关系

本主题中的表显示了不同 PnpObjectType 对象之间的关系以及必须用于在这些对象之间导航的属性。 请注意,DeviceInformation 对象等同于 PnpObjectType 等于 deviceInterfacePnpObject

多对一关系

此部分中的表显示如何从与其他对象具有多对一关系的对象导航。例如,一个或多个设备接口(由 DeviceInformation 对象来表示)可能会属于同一设备容器。 前两列的标题包含你使用其开始的即插即用 (PnP) 对象的类型。第三列中的条目包含你要查找的 PnP 对象。表中的单元格(如果已填写)包含可以用于查询相关 PnP 对象的属性。

要从列标题中列出的对象导航到第三个列中列出的对象,请执行以下操作:

  1. 查找某个属性,该属性处于与你使用其开始的对象相对应的标题相同的列中,且处于与你希望查找的相关对象相同的行中。
  2. 通过使用如何检索相关的 PnP 对象中所述的步骤,检索属性。
  3. 将检索到的值用作 PnpObject.createFromIdAsync 调用中的 ID 参数来创建相关类型的对象。
设备接口 (DeviceInformation) 设备 相关对象
System.Devices.ContainerId System.Devices.ContainerId deviceContainer
System.Devices.DeviceInstancePath 设备
System.Devices.DeviceInterfaceClassGuid deviceInterfaceClass

 

一对多关系

此部分中的表显示如何从与其他对象具有一对多关系的对象导航。 要从你使用其开始的对象(位于顶行)导航到右侧列出的相关对象,请执行以下操作:

  1. 在与你使用其开始的对象的标题相同的列中,和在与你希望查找的相关对象相同的行中,查找某个属性。

  2. 使用你开始使用的对象(来自标题行)的 ID 以及表中标识的属性来形成表单“<property>:=<id>”的 AQS 字符串

    例如,如果我们想在容器中查找标识为“{1451362b-4b9c-4780-a4bf-6c001619646c}”的所有接口,则 AQS 字符串将为“System.Devices.ContainerId:={1451362b-4b9c-4780-a4bf-6c001619646c}”。

  3. 将 AQS 字符串用作 Windows.Devices.Enumeration.Pnp.PnpObject.findAllAsync 调用的参数来查找相关类型的对象。

    注意  使用包含 GUID 的属性时,必须在形成 AQS 字符串时将 GUID 值放置在括号中。

     

deviceContainer 设备 deviceInterfaceClass 相关对象
System.Devices.ContainerId System.Devices.DeviceInstancePath System.Devices.DeviceInterfaceClassGuid deviceInterface
System.Devices.ContainerId System.Devices.DeviceInstancePath 设备

 

示例

从 DeviceInformation ID 获取容器

你可能会需要获取设备接口所属的容器的属性。例如,如果你有某个选定设备的设备 ID,但需要获取型号名称,那么你需要创建一个容器对象,因为 System.Devices.ModelName 是一个容器属性,而不是设备接口属性。

此代码显示如何获取以设备 ID 开头的容器属性。


// GetModelNameFromDeviceID gets the ModelName property from the
// device interface's container.
// The parameter devID is assumed to be a valid device interface ID.
string GetModelNameFromDeviceID (devID)
{
// First create a DeviceInformation object from the ID.
// Create the argument that specifies that additional properties
// returned should include the System.Devices.ContainerId property.
   var propertiesToGet = new Array();
   propertiesToGet.push("System.Devices.ContainerId");


// Create a DeviceInformation object from the ID.
   var Enum = Windows.Devices.Enumeration;
   var DevInfo = Enum.DeviceInformation;
   var contID;   // The container ID
   DevInfo.createFromIdAsync(devID, propertiesToGet).then(
       function(devInf) {             
            var prop = devInf.properties;
            if (prop) {
                contID = prop.lookup("System.Devices.ContainerID");               
            }
       },
       function (e) {
           displayError("Failed to create DeviceInformation: " + e.message);
       });

// Use the container ID to create a PnPObject representing the container,
// and specify that the created object should have a 
// System.Devices.ModelId property.


// Create the argument that specifies that the additional properties to
// return should include the System.Devices.ContainerId property.
   var containerPropertiesToGet = new Array();
   containerPropertiesToGet.push("System.Devices.ModelId");

   var modelID;


var Pnp = Enum.Pnp;
var pnpObjType = Pnp.PnpObjectType;
var deviceType = pnpObjType.device;

// NOTE: We need to add extra braces "{}" back to the container ID before
// passing it to createIdAsync (a pair of braces is lost in the implicit
// conversion from GUID to string).
   contID = "{" + contID + "}";

// Create the container from its ID.
   Pnp.createFromIdAsync(deviceType, contID, containerPropertiesToGet).then(
       function(contInf) {
           var prop = contInf.properties;
           if (prop) {
               modelID = prop.lookup("System.Devices.ModelID");
           });
   return modelID;
}

注意  

如上一示例中所示,如果你将属性查找的 GUID 结果传递给采用 GUID 作为字符串参数的函数,那么你需要在将该结果传递给该函数之前在 GUID 参数两侧加上 额外的大括号 "{}"。这是因为属性查找的结果是变体类型,而不是字符串,因此将参数传递给采用字符串的函数时,在隐式转换中会丢失一对 大括号。

 

获取某个特定设备容器中的所有 DeviceInformation 对象

此示例演示如何通过形成 AQS 查询并将该查询传递给 findAllAsync.来找到指定设备容器中的所有 DeviceInformation 对象。

function findInterfacesInContainer(containerId) {

    var Enum = Windows.Devices.Enumeration;
    var aqsString = "System.Devices.ContainerId:=\"" + containerId + "\"";

    Enum.DeviceInformation.findAllAsync(aqsString, null).then(
            successCallback, 
            errorCallback);
}

// Handles successful completion of the findAllAsync method.
function successCallback(deviceInformationCollection) {
    // Add your code here for processing the enumerated device collection.
}

// Handles an error completion of the findAllAsync method.
function errorCallback(e) {
    // Add your error-handling code here.
}

相关主题

如何为设备或 PnP 对象检索附加属性

AQS 查询