2015-03-19 2 views
0

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

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

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

В соответствии с this MSDN article свойствами и атрибутами являются структуры PROPERTYKEY с двумя частями: идентификатором категории и уникальным идентификатором для этой категории.

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

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

Я ожидал, что 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; 

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

Что я делаю.

Не могли бы помочь объяснить, что мне нужно сделать, чтобы все исправить?

EDIT: I found this code which seems to be in python, который получает тип устройства.

Я пытаюсь отправить его в дельфий.

+0

Просьба показать декларацию вашего интерфейса и сообщить нам значение 'iRes'. Кроме того, 'iRes' не является' Integer'. Это «HRESULT». –

+0

@DavidHeffernan Не могли бы вы рассказать о том, что вы имеете в виду под «декларацией примера»? Я не совсем понимаю. iRes = -2147024894. О, я вижу это сейчас, спасибо. –

+0

Я отредактировал вопрос. См. Править внизу. –

ответ

-1

Хорошо, поэтому в итоге я понял, как читать тип устройства.

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

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

EDIT: Я использовал источник found here в качестве ссылки на программирование WPD.

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

Code is available HERE!!!

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

Запрограммирован в Delphi XE7.

+0

Дэвид, я подготовил для вас код. Не стесняйтесь использовать его! –

+0

Это не отвечает на вопрос, который был задан, и не представляет никакого кода. Ссылки на сайты не ценны, особенно те, которые содержат PDF-файлы и не выбираются текст. -1 –

+0

Необходим внешний код, так как в теле допускается только 30 тысяч символов. Мой код содержит около 60 тысяч символов. У меня не было выбора. –

0

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

+0

высокая вероятность. в соответствии с https://msdn.microsoft.com/en-us/library/windows/desktop/dd389048%28v=vs.85%29.aspx, the the the the the the the the the the bottom внизу, говоря «Замечание. Приложения WPD должны использовать возможности портативное устройство для определения функционально, а не значение WPD_DEVICE_TYPES. –

+0

Я не понял вопрос? Вас интересовало понимание ошибки? –

+0

Я думаю, вы неправильно поняли вопрос, может быть, я был недостаточно ясен. Я хотел бы определить тип устройства. это телефон? это камера? что это за устройство? –

Смежные вопросы