确定 Delphi 中的 WPD 设备类型

2024-01-11

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

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

根据这篇 MSDN 文章 https://msdn.microsoft.com/en-us/library/windows/hardware/ff597865%28v=vs.85%29.aspxWPD 设备类型是 WPD 设备属性,可以通过读取设备的属性来读取。

然后根据这篇 MSDN 文章 https://msdn.microsoft.com/en-us/library/windows/hardware/ff597900(v=vs.85).aspx属性和特性被定义为 PROPERTYKEY 结构,由两部分组成:类别 GUID 和该类别的唯一 ID。

我找到了 GUID 和唯一 IDWPD_DEVICE_TYPE哪个是WPD_DEVICE_TYPE_FMTID : TGuid = '{26D4979A-E643-4626-9E2B-736DC0C92FDC}'; WPD_DEVICE_TYPE_PID = 15;

我的问题是我正在考虑如何检索信息。

我正期待着IPortableDevice会有一个.Property程序就像IPortableDeviceContent,但事实并非如此。

然而,IPortableDeviceManager确实有一个称为GetDeviceProperty.

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

Code:

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 文章, https://msdn.microsoft.com/en-us/library/windows/desktop/dd388692(v=vs.85).aspx pData应设置为 NULL 并将 pcbData 设置为零才能获取 pcbData 的大小。

我正在做的事。

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

EDIT: 我发现这段代码似乎是在 python 中 http://fossies.org/linux/misc/calibre-2.21.0.tar.gz/calibre-2.21.0/src/calibre/devices/mtp/windows/device_enumeration.cpp,获取设备类型。

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


Your HRESULT is $80070002。那是一个COM 错误代码 https://msdn.microsoft.com/en-us/library/windows/desktop/ms690088.aspx包装 Win32 错误代码,ERROR_FILE_NOT_FOUND https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx#ERROR_FILE_NOT_FOUND。这意味着设备 ID 或属性名称不正确。假设您确实获得了正确的设备 ID,那么明显的结论是您正在尝试读取不存在的属性的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 Delphi 中的 WPD 设备类型 的相关文章

  • 如何制作Applicative的固定长度向量实例?

    最近了解了推广 决定尝试写向量 LANGUAGE DataKinds GADTs KindSignatures module Vector where data Nat Next Nat Zero data Vector Nat gt gt
  • 如何隐藏 WebBrowser 直到网站完成加载/下载过程?

    我想知道我该如何隐藏WebBrowser直到网站加载过程完成 另外 我使用 Panel1 和WebBrowser在它的上面 为什么 好吧 这样 我可以完全像我想要的 WebBrowser 一样设置 Panel1 的大小和位置 然后将 Web
  • 检查对象类型是否继承抽象类型

    说我有一个对象 someDrink 它可能是类型CocaCola or Pepsi两者都继承了抽象Cola 它继承了Drink 或任何种类的饮料 我有一个方法可以返回一串最喜欢的饮料 public string PreferredDrink
  • Delphi XE2 中的 TDataModule.ClassGroup 伪属性到底有什么作用?

    我尝试将一个组件从一个数据模块复制并粘贴到 Delphi XE2 中的另一个数据模块中 该组件是一个 Fast Report 数据源链接组件 数据模块是全新的 刚刚在 XE2 中创建 其他人也遇到了同样的问题并报告了质量中心为106369
  • 开发 Delphi Windows 7 应用程序的规则 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以找到开发适用于 Windows 7 的 Delphi 应用程序时应遵循的最佳规则集 Marco 最近发表了 2 篇关于此主题的帖
  • 对 smtp.live.com 和 TIdSmtp(Indy、Delphi)的 SSL 支持

    我正在尝试连接到 smtp live com 发送电子邮件 live com 自 2009 年以来显然支持免费的 pop3 smtp 但这对我来说完全是新闻 当我尝试连接到 smtp live com 端口 587 时 会发生以下情况 Me
  • 以与文件大小相同的格式获取类或对象的大小?

    如何从内存中最好地确定类的大小 这是一个可以使用的基本示例类 请注意 这些变量除了用于示例之外没有其他用途 type TMyClass class public fString1 string fString2 string fIntege
  • ClientDataset 索引更改时不计算 TAggregateField

    我正在使用连接到 DBGrid 的 TClientDataset 和几个聚合字段 用于计算其他几个浮点字段的总和 所有字段均已在设计时创建 一切都按预期工作 直到 ClientDataset 的 IndexName 使用自定义索引更改 以便
  • Assembly.GetTypes() 返回类型的顺序是什么?

    如果我获得 AppDomain 中的类型列表 这些类型是否有固有的顺序 List
  • TEdit onclick 全选?

    每当用户单击 TEdit1 或单击选择其中的某些文本时 如何选择 TEdit1 的所有文本 执行超出默认行为的任何操作都可能非常危险TEdit控制 您的用户知道标准 Windows 控件的行为方式 任何偏离此的行为都可能导致混乱 默认情况下
  • Spring Boot如何读取jar外部的属性文件

    在我的目标文件夹中 有 2 个文件夹 lib 和 conf 所有的属性文件都放在conf文件夹中 jar放在lib Folder中 在 Spring Boot 之前 我们在 spring xml 中使用以下配置来使用 value
  • delphi中生成随机数

    我想在delphi中创建一个随机数并将其分配给文件作为文件名 我设法做到了这一点 但是当我单击按钮生成数字时 它总是以 0 开头 知道如何修复它 procedure TForm1 Button1Click Sender TObject va
  • 换肤时访问 hostComponent 的自定义属性 - Flex 4.5、SDK 4.5

    使用 SDK 4 1 我能够从自定义皮肤访问自定义按钮组件的自定义属性 我当前正在工作的项目需要 SDK 4 5 但我无法访问这些属性 这是一个例子 自定义按钮组件
  • 使用 postgresql DB 存储 NULL 值需要多少磁盘空间?

    假设我的表上有一列定义了以下内容 MyColumn smallint NULL 存储 0 1 或其他值等值应该需要 2 个字节 1 但是如果我将 MyColumn 设置为NULL 需要多少空间 需要0字节吗 出于管理目的或每列 行是否有一些
  • TControlState.csDesignerHide 与 TControlStyle.csNoDesignVisible

    VCL 似乎提供了两种向表单设计者隐藏控件的机制 TControlState csDesignerHide and TControlStyle csNoDesignVisible 就 IDE 而言 它们之间有什么区别 什么时候应该使用哪个
  • 在主表单之前显示登录表单

    我在表单之间导航时遇到问题 我使用 Delphi XE5 创建了一个 Android Firemonkey 移动应用程序 我目前有一个登录表单和主表单 现在我想要有关如何处理登录表单以显示在主表单之前的建议 在 项目选项 中的表单下 选择要
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • FreeMM 与 ShareMem

    我们有很多用 delphi 和 c builder 编写的 dll 库 并使用 sharemem 和 borlndmm dll 3d party 库中的对齐问题迫使我们转向 delphi 2007 中的新内存管理器 有人可以帮我解释一下 共
  • 防止被 0 除的 Typescript 类型

    我正在使用打字稿创建一个用于培训目的的计算系统 但在除法过程中出现打字错误 您知道如何解决吗 type Variable value number resolve gt number type NoZeroVariable value Om
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或

随机推荐

  • 使用 CoreData 支持的 NSArrayController 在 NSTableView 中创建组行

    假设我在核心数据模型中存储了一堆 Article 对象 每篇文章都维护一个阅读进度属性 该属性表示用户已阅读了文章的多少 一旦用户完全阅读完该文章 该文章就会被标记为 已读 在此之前 它将被标记为 未读 现在我有一个绑定到 NSArrayC
  • 在 Android 活动上调用 finish() 并没有真正完成

    我正在打电话finish 但我的活动仍在继续 我有一个由主活动屏幕上的菜单调用的活动 在我的活动中onCreate 方法我有以下代码片段 Make sure there are some events in the list if theE
  • 我们可以在单元测试时检查 uitextfield 的验证吗?

    假设我们有一些验证ViewController 比如 vc1 对于UItextfield in shouldChangeCharactersInRange方法 因为用户只能输入数字 不能输入字母或其他特殊字符 我只是想知道在我们的XCTes
  • 将 Ruby 扩展方法添加到 Rails 3 的最佳实践?

    我有一个数组扩展方法 我想在我的Rails 3项目 它应该住在哪里 我有一个应用程序 类 我最初放置它 array extensions rb 并在我的 config application rb 中加载路径 config autoload
  • 从 Sinatra 访问标头

    我正在尝试访问 sinatra 中过滤器中的标头 我的请求包含标头 HTTP AUTH 但我无法访问它 我的过滤器是 before do halt 403 unless request HTTP AUTH test end 从我的机架测试来
  • Mongo 类不会在 Yii 控制台应用程序中自动加载

    我正在使用 Yii 和 mongodb YiiMongoDbSuite 扩展 并创建了一个控制台应用程序 但它不起作用并给出错误 include Mongo php 无法打开流 没有这样的文件或目录 在文件 var www yii fram
  • 如何从日志文件中制作 JMeter 输出图表?

    我需要生成与 JMeter 相同的图表 但来自我的应用程序 C VB 等 随时间变化的响应时间 https i stack imgur com qDJj9 png 响应时间分布 https i stack imgur com ujcy3 p
  • ASP.NET 解析来自 ajax 调用 javascript 日期的 DateTime 结果

    介绍 我有一个WebMethod在我的 ASP NET 页面上返回一个Person目的 其中一个字段是Birthday这是一个DateTime财产 网络方法 WebMethod public static Person GetPerson
  • 简单注入器:在基类中注入属性

    几个星期以来我一直在使用简易注射器 https simpleinjector org依赖注入容器 取得了巨大成功 我喜欢它的简单配置 但现在我有一个设计 我不知道如何配置 我有一个基类 其中派生出许多类型 并且我想将依赖项注入到基类的属性中
  • PowerShell将字符串拆分为二维数组

    TL DR 使用 PowerShell 我想首先用换行符 n 拆分文本字符串 将其存储到数组中 然后用逗号将这些数组条目拆分为二维数组 我在访问 或可能创建 第二维中的任何信息时遇到问题 INFO 我有以下字符串 存储为 services
  • 将另一个提交导入到我的存储库

    抱歉 新手问题 但是有没有办法将其他人提交 到他自己的存储库 导入到我的存储库 手动更改 900 多个文件将是一件困难的事情 您需要将对方的存储库添加为您的远程存储库 并获取其更改 git remote add matefork
  • Docker - Dockerfile 中使用 RUN 的 MySQL 命令(错误 2002)

    我正在使用 Docker 创建一个以 mysql 作为基础镜像的 dockerfile FROM mysql set root pass ENV MYSQL ROOT PASSWORD password update linux RUN a
  • 远程服务器返回错误:(407) 需要代理身份验证

    我将此代码与 NET 3 5 一起使用并收到错误 远程服务器返回错误 407 需要代理身份验证 using WebClient client new WebClient WebRequest DefaultWebProxy Credenti
  • 如何动态添加分页符到打印页面?

    打印页面上的内容很长 但是我们在打印时将文本的一些内容剪掉了 替代文本 http img694 imageshack us img694 6766 printpage jpg http img694 imageshack us img694
  • Magento - 根据环境加载local.xml

    我想要 3 个app etc local xml文件 将它们称为 local xml staging xml 和 live xml 我想根据我在 vhosts 或 htaccess 中设置的环境变量加载它们 这样我就可以拥有单独的数据库等
  • 为什么 SqlParameter 名称/值构造函数将 0 视为 null?

    我在一段代码中观察到一个奇怪的问题 其中即席 SQL 查询没有产生预期的输出 即使其参数与数据源中的记录匹配 我决定在立即窗口中输入以下测试表达式 new SqlParameter Test 0 Value 这给出了结果null 这让我摸不
  • 如何在WPF中的特定位置添加菜单项?

    我想添加一个像这样的菜单项 AddChild new MenuItem Header Test 然而 问题是菜单项出现在最后 逻辑上 现在我正在寻找一种将其添加到特定位置的方法 A B C 我想将它添加到 A 和 B 之间 XAML 如下所
  • 在 R 中封装 sqldf

    是否可以在sqldf中的字符串内添加注释 就像是 sqldf select ProductID count distinct SalePrice as num regPz from MYDF where SalesFlag 0 coded
  • AndroidStudio - Gradle 中的模块依赖关系

    我在 Android Studio 中使用模块依赖项编译 Android 应用程序时遇到了一些问题 所以 我希望我的应用程序使用 slidingmenu 库 链接here https github com jfeinstein10 Slid
  • 确定 Delphi 中的 WPD 设备类型

    我正在尝试确定我的 WPD 设备在 Delphi 中的类型 在我的应用程序中 我需要知道该设备是手机还是相机或者什么 根据这篇 MSDN 文章 https msdn microsoft com en us library windows h