Определить тип устройства 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
, А это значит, что либо идентификатор устройства, либо имя свойства неверны. Предполагая, что вы действительно получили правильный идентификатор устройства, очевидным выводом является то, что вы пытаетесь прочитать значение свойства, которое не существует.