0

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

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

根据这篇 MSDN 文章,WPD 设备类型是一个 WPD 设备属性,可以通过读取设备的属性来读取。

然后根据这篇 MSDN 文章,属性和属性被定义为 PROPERTYKEY 结构,包含两部分:类别 GUID 和该类别的唯一 ID。

我发现 GUID 和唯一 IDWPD_DEVICE_TYPEWPD_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。

4

2 回答 2

0

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

于 2015-03-19T12:39:59.790 回答
-2

好的,所以最终我想出了如何读取设备的设备类型。

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

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

编辑:我使用此处找到的源代码作为 WPD 编程的参考。

使用外部硬盘驱动器、SD 存储卡读卡器、USB 记忆棒、Apple iPhone 和三星 Galaxy 手机测试代码。

代码在这里可用!!!

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

在德尔福 XE7 中编程。

于 2015-03-22T11:26:36.857 回答