Поделиться через


Как получить связанные самонастраивающиеся объекты (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

В этом разделе описывается, как находить связанные друг с другом самонастраивающиеся объекты (PnP). Например, вам может потребоваться объект-контейнер устройства, связанный с информационным объектом устройства. Контейнеры устройства представляют физическое устройство так, как его видит пользователь. Контейнер устройства предоставляет вам доступ к информации, относящейся ко всему оборудованию в целом, а не к одному из его функциональных интерфейсов. Примеры свойств контейнера устройства — название производителя или модели.

Понимание связей между самонастраивающимися объектами

Таблицы в этом разделе показывают связи между разными объектами PnpObjectType и свойства, которые необходимо использовать для перехода между объектами. Обратите внимание, что объект DeviceInformation эквивалентен PnpObject, а PnpObjectType эквивалентен deviceInterface.

Связи "многие к одному"

Таблица в этом разделе показывает, как переходить от объекта, который имеет связь "многие к одному" с другими объектами. Например, один или несколько интерфейсов устройства (представленных объектами DeviceInformation) могут относиться к одному и тому же контейнеру устройства. Заголовки первых двух столбцов описывают тип самонастраивающегося объекта (PnP), с которого вы начинаете. Записи в третьем столбце содержат информацию о связанном объекте PnP, который вы хотите найти. Заполненные ячейки таблицы содержат информацию о свойстве, которое можно использовать, чтобы создать запрос связанного объекта PnP.

Чтобы перейти от объекта, указанного в заголовке столбца, к объекту, указанному в третьем столбце, выполните следующие действия:

  1. Найдите свойство, которое содержится в том столбце, название которого совпадает с объектом, с которого вы начали, и находится в той же самой строке, что и связанный объект, который вы хотите найти.
  2. Получите свойство, выполнив действия, описанные в теме "Получение связанных самонастраивающихся объектов"
  3. Используйте полученное значение в качестве параметра id при вызове PnpObject.createFromIdAsync, чтобы создать объект связанного типа.
интерфейс устройства (DeviceInformation) устройство связанный объект
System.Devices.ContainerId System.Devices.ContainerId deviceContainer
System.Devices.DeviceInstancePath устройство
System.Devices.DeviceInterfaceClassGuid deviceInterfaceClass

 

Связи "один ко многим"

Таблица в данном разделе показывает, как перейти от объекта, который имеет связь вида 1-к-N с другими объектами. Чтобы перейти от объекта, с которого вы начали работу (в верхней строке), к связанному объекту, указанному справа, выполните следующие действия:

  1. Найдите свойство, указанное в том же столбце, что и название объекта, с которого вы начали, и в той же строке, что и связанный объект, который вы хотите найти.

  2. Используйте идентификатор объекта, с которого вы начали (из строки заголовка), и свойство, которое вы определили в таблице, чтобы сформировать строку AQS вида "<property>:=<id>".

    Например, если нам нужно найти все интерфейсы в контейнере с идентификатором "{1451362b-4b9c-4780-a4bf-6c001619646c}", необходимо использовать строку AQS "System.Devices.ContainerId:={1451362b-4b9c-4780-a4bf-6c001619646c}".

  3. Чтобы найти объекты связанного типа, используйте строку AQS в качестве параметра для вызова Windows.Devices.Enumeration.Pnp.PnpObject.findAllAsync.

    Примечание  При работе со свойствами, содержащими GUID, значение GUID необходимо поместить в скобки при формировании строки AQS.

     

deviceContainer устройство deviceInterfaceClass связанный объект
System.Devices.ContainerId System.Devices.DeviceInstancePath System.Devices.DeviceInterfaceClassGuid deviceInterface
System.Devices.ContainerId System.Devices.DeviceInstancePath устройство

 

Примеры

Получение контейнера из идентификатора DeviceInformation

Вам может понадобиться получить свойства контейнера, которому принадлежит интерфейс устройства. Например, если у вас есть код выбранного устройства и вы хотите узнать название модели, нужно создать объект-контейнер, потому что свойство System.Devices.ModelName — это свойство контейнера, а не интерфейса устройства.

В этом фрагменте кода показано, как получить свойство контейнера, начиная с кода устройства.


// 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 в конкретном контейнере устройства.

В этом примере показано, как найти все объекты DeviceInformation в конкретном контейнере устройства путем создания запроса AQS и передачи запроса в findAllAsync.

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