首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中确定WPD设备类型

在Delphi中确定WPD设备类型
EN

Stack Overflow用户
提问于 2015-03-19 12:25:47
回答 2查看 1.5K关注 0票数 0

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

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

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

然后,根据这篇MSDN文章,属性和属性定义为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会有一个像IPortableDeviceContent一样的.Property过程,但它没有。

然而,IPortableDeviceManager确实有一个名为GetDeviceProperty的过程。

我有示例代码,它可以获得WPD设备的友好名称(从单元PortableDeviceApiLib_TLB.pas)。

代码:

代码语言:javascript
复制
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;

我获得设备属性的测试代码如下(基本上相同.几乎.)

代码语言:javascript
复制
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文章,,为了获得pcbData的大小,应该将pData设置为NULL,将pcbData设置为零。

这是我正在做的。

有人能帮我解释一下我需要做什么才能把事情做好吗?

编辑: 我在python中找到了这段代码,它获取设备类型。

我正试着把它移植到德尔福。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-22 11:26:36

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

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

可以阅读一些非常有趣的信息,如设备的电池水平,如果可用的话。

编辑:我使用源在这里发现的作为WPD编程的参考。

代码测试用外部硬盘驱动器,SD记忆卡读卡器,USB棒,苹果iPhone和三星银河手机。

这里有密码!

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

用Delphi XE7编程。

票数 -2
EN

Stack Overflow用户

发布于 2015-03-19 12:39:59

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29144536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档