Определить тип устройства WPD в Delphi

Я пытаюсь определить, какой тип моего устройства WPD в Delphi.

В моем приложении мне нужно знать, является ли устройство телефоном или камерой или чем-то еще.

В соответствии с этой статьей MSDN тип устройства WPD - это свойство устройства WPD, которое можно прочитать, прочитав свойства устройства.

Затем в соответствии с этой статьей MSDN свойства и атрибуты определяются как структуры PROPERTYKEY, состоящие из двух частей: GUID категории и уникальный идентификатор для этой категории.

Я нашел GUID и Uinique ID для WPD_DEVICE_TYPE которыеWPD_DEVICE_TYPE_FMTID : TGuid = '{26D4979A-E643-4626-9E2B-736DC0C92FDC}';WPD_DEVICE_TYPE_PID = 15;

Моя проблема в том, что я пытаюсь выяснить, как получить информацию.

Я ожидал, что IPortableDevice будет иметь .Property процедура так же, как IPortableDeviceContent, но это не так.

Тем не мение, IPortableDeviceManager действительно ли процедура называется GetDeviceProperty,

У меня есть пример кода, который может получить понятное имя устройства WPD (из модуля PortableDeviceApiLib_TLB.pas).

Код:

function GetDeviceFriendlyName(sDeviceId: WideString): WideString;
  var iDevNameLen: LongWord;
      iRes: Integer;
      s: WideString;
begin
  //get length of friendly name:
  iDevNameLen := 0;
  s := '';

  iRes := My_IPortableDeviceManager.GetDeviceFriendlyName(PWideChar(sDeviceId),  Word(nil^),  iDevNameLen);

  if iRes = S_OK then
    if iDevNameLen>0 then
    begin
      SetLength(s, iDevNameLen);
      ZeroMemory(PWideChar(s), iDevNameLen);
      iRes := My_IPortableDevice.GetDeviceFriendlyName(PWideChar(sDeviceId),  PWord(PWideChar(s))^,  iDevNameLen);
      s := Trim(s);
    end;

  result := s;
end;

Мой тестовый код для получения свойства устройства выглядит следующим образом (в основном то же самое... почти...):

function GetDeviceProperty(ADeviceID, APropertyName: WideString): WideString;
  var iDevPropLen: LongWord;
      iRes: Integer;
      s: WideString;
      t: cardinal;
begin
  //get length of property name:
  iDevPropLen := 0;
  s := '';

  iRes := My_IPortableDeviceManager.GetDeviceProperty(PWideChar(ADeviceID), PWideChar(APropertyName), Byte(nil^), iDevPropLen, t);
  showmessage(inttostr(ires)+#13#10+inttostr(iDevPropLen)+#13#10+inttostr(t));
  //just trying to get some useful information…
end;

Согласно этой статье MSDN,pDataдолжно быть установлено в NULL и pcbData установлено в ноль, чтобы получить размер pcbData.

Что я и делаю.

Может ли кто-нибудь помочь объяснить, что мне нужно сделать, чтобы понять это правильно?

РЕДАКТИРОВАТЬ: я нашел этот код, который, кажется, на Python, который получает тип устройства.

Я пытаюсь перенести его на Delphi.

2 ответа

Решение

Итак, в конце концов я выяснил, как читать тип устройства устройства.

Что нужно было сделать, это прочитать свойства устройства.

Можно прочитать некоторую очень интересную информацию, такую ​​как уровень заряда батареи устройства, если таковой имеется.

РЕДАКТИРОВАТЬ: я использовал источник, найденный здесь, как ссылку на программирование WPD.

Код проверен с использованием внешних жестких дисков, устройства чтения карт памяти SD, USB-накопителей, Apple iPhone и телефона Samsung Galaxy.

Код доступен ЗДЕСЬ!!!

Просто скопируйте и вставьте код в новый проект VCL, добавьте список с именем DeviceList, заметку с именем LogMemo, панель с именем Panel1 и кнопку внутри Panel1 с именем Button1. Затем дважды щелкните по списку, дважды щелкните по кнопке и, наконец, дважды щелкните по главной форме, и все должно работать без сбоев.

Программируется в Delphi XE7.

Ваш HRESULT является $80070002, Это код ошибки COM, который оборачивает код ошибки Win32, ERROR_FILE_NOT_FOUND, А это значит, что либо идентификатор устройства, либо имя свойства неверны. Предполагая, что вы действительно получили правильный идентификатор устройства, очевидным выводом является то, что вы пытаетесь прочитать значение свойства, которое не существует.

Другие вопросы по тегам