在Delphi中确定WPD设备类型

时间:2015-03-19 12:25:48

标签: delphi types properties wpd

我正在尝试确定我的WPD设备在Delphi中的类型。

在我的应用程序中,我需要知道设备是手机还是相机,或者它是什么。

根据this MSDN article,WPD设备类型是一个WPD设备属性,可以通过读取设备的属性来读取。

然后根据this MSDN article属性和属性定义为PROPERTYKEY结构,它包含两个部分:类别GUID和该类别的唯一ID。

我找到了WPD_DEVICE_TYPE的GUID和Uinique ID 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;

根据this MSDN article, pData应设置为NULL并将pcbData设置为零以获取pcbData的大小。

我在做什么。

有人可以帮助解释我需要做什么才能做到正确吗?

修改 I found this code which seems to be in python,获取设备类型。

我正在尝试将其移植到delphi。

2 个答案:

答案 0 :(得分:0)

您的HRESULT$80070002。这是一个包裹Win32错误代码COM error codeERROR_FILE_NOT_FOUND。这意味着设备ID或属性名称不正确。假设您确实获得了正确的设备ID,那么显而易见的结论是您试图读取不存在的属性的值。

答案 1 :(得分:-2)

好的,最后我想出了如何阅读设备的设备类型。

需要做的是阅读设备属性。

可以读取一些非常有趣的信息,例如设备的电池电量(如果有)。

编辑:我使用源found here作为WPD编程的参考。

使用外置硬盘,SD存储卡读卡器,USB记忆棒,Apple iPhone和三星Galaxy手机进行代码测试。

Code is available HERE!!!

只需将代码复制并粘贴到新的VCL项目中,添加一个名为DeviceList的列表框,一个名为LogMemo的备忘录,一个名为Panel1的面板,以及一个名为Button1的Panel1内的按钮。然后双击列表框,双击按钮,最后双击主窗体,一切都应该运行得很糟糕。

在Delphi XE7中编程。