使用WPD API操作MTP设备一些总结

使用WPD API操作MTP设备总结

本文分为两部分:1、WPD基本架构和概念的理解;2、使用WPD API操作MTP(拷贝、删除)设备

1、WPD基本架构和概念

1.1、WPD架构

原文:https://docs.microsoft.com/en-us/windows/win32/wpd_sdk/architecture-overview

WPD架构可以被分成三个processes。在这个processes包含了WPD三个主要的组件:API、serializer、driver。如下图所示。
在这里插入图片描述

1.2、概念模型

原文:https://docs.microsoft.com/en-us/windows/win32/wpd_sdk/the-conceptual-model

WPD概念模型由objects,properties和resources组成。

1.2.1、Objects

在WPD中,设备中的逻辑实体称为Objects。通常但不总是,这些Objects代表了设备中的数据。

Objects中含有properties,并使用ObjectId来索引。

下图展现了一个图片对象和它的properties、resources之间的关系。
在这里插入图片描述

1.2.2、Properties

对象特性提供了一种交换对象描述性元数据的机制。举个例子,一个图片对象可能包含了描述它的文件名称、大小、格式、像素宽等特性。

特性有当前值和属性。WPD定义了一组标准的特性,厂商也可以添加自身的特性。

1.2.3、Resources

资源是二进制数据的占位符。一个对象可能包含多个资源。例如,如果一个对象代表了一个包含音频注释的图片文件,那么这个对象的资源可能如下:

  • 一个默认资源。这个资源表示了整个图片文件
  • 一个缩略图资源。这个资源表示了图片的缩略图数据。
  • 一个音频注释资源。这个资源表示了与该图片关联的音频数据。

2.2、使用WPD API操作MTP设备

源码地址:https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/PortableDeviceCOM

DeviceEnumeration.cpp 用于扫描已连接的MTP设备和选择指定设备;

ContentEnumeration.cpp 获取当前连接设备上所有的Objects;

ContentTransfer.cpp 拷贝或删除设备中的文件,或先设备中传输文件;

ContentProperties.cpp 获取指定设备中指定内容的特性;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Windows SDK 版本为 8.1 实现枚举 WPD 设备内容的基本步骤: 1. 初始化 WPD API,并获取 WPD 服务的 IUnknown 接口。 ``` CoInitialize(NULL); HRESULT hr = CoCreateInstance( __uuidof(PortableDeviceManager), NULL, CLSCTX_INPROC_SERVER, __uuidof(IPortableDeviceManager), (VOID**)&pPortableDeviceManager ); ``` 2. 使用 IPortableDeviceManager::GetDevices 方法获取连接到计算机上的 WPD 设备。 ``` GUID guid = { 0 }; DWORD dwCount = 0; hr = pPortableDeviceManager->GetDevices(&guid, NULL, &dwCount); if (SUCCEEDED(hr) && dwCount > 0) { PWSTR* pDeviceIDs = new PWSTR[dwCount]; hr = pPortableDeviceManager->GetDevices(&guid, pDeviceIDs, &dwCount); if (SUCCEEDED(hr)) { // 枚举设备内容 for (DWORD i = 0; i < dwCount; i++) { EnumerateDeviceContent(pDeviceIDs[i]); } } // 释放设备 ID 数组 for (DWORD i = 0; i < dwCount; i++) { CoTaskMemFree(pDeviceIDs[i]); } delete[] pDeviceIDs; } ``` 3. 枚举设备内容,使用 IPortableDeviceContent 接口获取设备内容信息。 ``` void EnumerateDeviceContent(PCWSTR pszDeviceID) { IPortableDevice* pPortableDevice = NULL; IPortableDeviceContent* pPortableDeviceContent = NULL; // 连接到设备 HRESULT hr = CoCreateInstance( __uuidof(PortableDevice), NULL, CLSCTX_INPROC_SERVER, __uuidof(IPortableDevice), (VOID**)&pPortableDevice ); if (SUCCEEDED(hr)) { hr = pPortableDevice->Open(pszDeviceID, pPortableDeviceCallback); if (SUCCEEDED(hr)) { hr = pPortableDevice->Content(&pPortableDeviceContent); if (SUCCEEDED(hr)) { // 枚举设备内容 EnumerateContent(pPortableDeviceContent, L""); } } // 关闭设备连接 pPortableDevice->Close(); } // 释放设备对象 if (pPortableDevice) { pPortableDevice->Release(); } if (pPortableDeviceContent) { pPortableDeviceContent->Release(); } } ``` 4. 使用 IPortableDeviceContent::EnumObjects 方法枚举设备内容。 ``` void EnumerateContent(IPortableDeviceContent* pContent, PCWSTR pszObjectID) { IEnumPortableDeviceObjectIDs* pEnum = NULL; // 枚举对象 ID HRESULT hr = pContent->EnumObjects(0, pszObjectID, NULL, &pEnum); if (SUCCEEDED(hr)) { DWORD dwFetched = 0; PWSTR pszObjectIDs[MAX_OBJECTS] = { 0 }; // 获取对象 ID 数组 hr = pEnum->Next(MAX_OBJECTS, pszObjectIDs, &dwFetched); if (SUCCEEDED(hr)) { // 枚举每个对象 for (DWORD i = 0; i < dwFetched; i++) { EnumerateObject(pContent, pszObjectIDs[i]); } } // 释放对象 ID 数组 for (DWORD i = 0; i < dwFetched; i++) { CoTaskMemFree(pszObjectIDs[i]); } } // 释放枚举器对象 if (pEnum) { pEnum->Release(); } } ``` 5. 使用 IPortableDeviceContent::Properties 方法获取对象属性。 ``` void EnumerateObject(IPortableDeviceContent* pContent, PCWSTR pszObjectID) { IPortableDeviceProperties* pProperties = NULL; // 获取对象属性 HRESULT hr = pContent->Properties(&pProperties); if (SUCCEEDED(hr)) { IPortableDeviceValues* pValues = NULL; // 获取对象属性值 hr = pProperties->GetValues(pszObjectID, NULL, &pValues); if (SUCCEEDED(hr)) { // 输出对象属性值 OutputObjectProperties(pValues); } // 释放属性值对象 if (pValues) { pValues->Release(); } } // 释放属性对象 if (pProperties) { pProperties->Release(); } } ``` 以上就是使用 Windows SDK 版本为 8.1 实现枚举 WPD 设备内容的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值