Как получить связанные самонастраивающиеся объекты (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
В этом разделе описывается, как находить связанные друг с другом самонастраивающиеся объекты (PnP). Например, вам может потребоваться объект-контейнер устройства, связанный с информационным объектом устройства. Контейнеры устройства представляют физическое устройство так, как его видит пользователь. Контейнер устройства предоставляет вам доступ к информации, относящейся ко всему оборудованию в целом, а не к одному из его функциональных интерфейсов. Примеры свойств контейнера устройства — название производителя или модели.
Понимание связей между самонастраивающимися объектами
Таблицы в этом разделе показывают связи между разными объектами PnpObjectType и свойства, которые необходимо использовать для перехода между объектами. Обратите внимание, что объект DeviceInformation эквивалентен PnpObject, а PnpObjectType эквивалентен deviceInterface.
Связи "многие к одному"
Таблица в этом разделе показывает, как переходить от объекта, который имеет связь "многие к одному" с другими объектами. Например, один или несколько интерфейсов устройства (представленных объектами DeviceInformation) могут относиться к одному и тому же контейнеру устройства. Заголовки первых двух столбцов описывают тип самонастраивающегося объекта (PnP), с которого вы начинаете. Записи в третьем столбце содержат информацию о связанном объекте PnP, который вы хотите найти. Заполненные ячейки таблицы содержат информацию о свойстве, которое можно использовать, чтобы создать запрос связанного объекта PnP.
Чтобы перейти от объекта, указанного в заголовке столбца, к объекту, указанному в третьем столбце, выполните следующие действия:
- Найдите свойство, которое содержится в том столбце, название которого совпадает с объектом, с которого вы начали, и находится в той же самой строке, что и связанный объект, который вы хотите найти.
- Получите свойство, выполнив действия, описанные в теме "Получение связанных самонастраивающихся объектов"
- Используйте полученное значение в качестве параметра id при вызове PnpObject.createFromIdAsync, чтобы создать объект связанного типа.
интерфейс устройства (DeviceInformation) | устройство | связанный объект |
System.Devices.ContainerId | System.Devices.ContainerId | deviceContainer |
System.Devices.DeviceInstancePath | устройство | |
System.Devices.DeviceInterfaceClassGuid | deviceInterfaceClass |
Связи "один ко многим"
Таблица в данном разделе показывает, как перейти от объекта, который имеет связь вида 1-к-N с другими объектами. Чтобы перейти от объекта, с которого вы начали работу (в верхней строке), к связанному объекту, указанному справа, выполните следующие действия:
Найдите свойство, указанное в том же столбце, что и название объекта, с которого вы начали, и в той же строке, что и связанный объект, который вы хотите найти.
Используйте идентификатор объекта, с которого вы начали (из строки заголовка), и свойство, которое вы определили в таблице, чтобы сформировать строку AQS вида "<property>:=<id>".
Например, если нам нужно найти все интерфейсы в контейнере с идентификатором "{1451362b-4b9c-4780-a4bf-6c001619646c}", необходимо использовать строку AQS "System.Devices.ContainerId:={1451362b-4b9c-4780-a4bf-6c001619646c}".
Чтобы найти объекты связанного типа, используйте строку 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.
}