在Delphi中确定WPD设备类型

在Delphi中确定WPD设备类型,delphi,types,properties,wpd,Delphi,Types,Properties,Wpd,我试图确定我的WPD设备在Delphi中是什么类型 在我的应用程序中,我需要知道该设备是电话还是照相机,或者是什么 根据WPD设备类型,WPD设备属性可以通过读取设备属性来读取 然后根据属性和属性定义为PROPERTYKEY结构,包含两部分:类别GUID和该类别的唯一ID 我找到了WPD\u DEVICE\u TYPE的GUID和Uinique ID,它们是 WPD_DEVICE_TYPE_FMTID:TGuid='{26D4979A-E643-4626-9E2B-736DC0C92FDC}'

我试图确定我的WPD设备在Delphi中是什么类型

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

根据WPD设备类型,WPD设备属性可以通过读取设备属性来读取

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

我找到了
WPD\u DEVICE\u TYPE
的GUID和Uinique ID,它们是
WPD_DEVICE_TYPE_FMTID:TGuid='{26D4979A-E643-4626-9E2B-736DC0C92FDC}'
WPD\u设备类型\u PID=15

我的问题是我正在让ISSE研究如何检索信息

我原以为
IPortableDevice
会有一个
.Property
过程,就像
IPortableDeviceContent
一样,但事实并非如此

但是,
IPortableDeviceManager
确实有一个名为
GetDeviceProperty
的过程

我有一些示例代码,可以获得WPD设备的友好名称(来自UnitPortableDeviceApilib_TLB.pas)

代码:

我获取设备属性的测试代码如下所示(基本相同…几乎相同):

根据
pData
应设置为NULL,并将pcbData设置为零,以获得pcbData的大小

我正在这样做

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

编辑: ,获取设备类型


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

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

好的,所以我最终找到了如何读取设备的设备类型

需要做的是读取设备属性

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

编辑:我使用源代码作为WPD编程的参考

使用外部硬盘、SD读卡器、USB记忆棒、苹果iPhone和三星Galaxy手机测试代码

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


用Delphi XE7编程。

请显示界面声明,并告诉我们
iRes
的值。而且,
iRes
不是一个
整数。这是一个
HRESULT
@DavidHeffernan您能详细说明一下“实例声明”的含义吗?我不太明白。iRes=-2147024894。哦,我现在明白了,谢谢。我编辑了这个问题。请参见底部的编辑。我认为您要查找的是
IPortableDeviceCapabilities
,而不是
IPortableDeviceManager
。前者公开了返回设备功能(图像捕获、音频捕获、存储等)的方法
GetFunctionalCategories
@J我已经看过了。外部硬盘驱动器有一个功能类别(取自我的测试应用)
Dev。功能类别计数:1。开发功能类别:WPD_Functional_Category_STORAGE
,我的iPhone也是如此。根据,底部有一条注释说,
注释WPD应用程序必须使用便携式设备的功能来确定功能,而不是WPD\u设备类型值。
我是否误解了这个问题?你对理解错误感兴趣吗?我想你误解了这个问题,也许我不够清楚。我想确定设备类型。是电话吗?它是照相机吗?这是什么装置?绝对不是。没人需要用勺子喂我,我只需要帮助。我很难理解如何确定WPD设备类型。我提供了我认为最有用的资源,包括代码。代码可以保持不变,我只需要了解如何确定WPD设备类型。不需要通过代码,也可以通过很好的解释。我们以前做过一次。你这么说,但你的行为与此不符。大卫,我已经为你编写了代码。请随意使用它!这不会回答所问的问题,也不会显示任何代码。非站点链接没有价值,尤其是那些包含PDF和不可选择文本的链接-1由于正文中只允许有30000个字符,因此需要外部代码。我的代码大约包含6万个字符。我别无选择。该文档可以作为其原始
.TXT
格式下载。它确实回答了我的问题,包括属性读取和wpd设备类型检索。
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;