Windows 媒体设备管理器使应用程序或插件能够与设备通信。 应用程序可以请求设备元数据、枚举和浏览附加设备,以及发送或接收对象(文件夹、文件、播放列表等)。 无论调用哪种类型的设备(MTP 或大容量存储类、基于版本 10 构建的服务提供商或基于早期版本的 Windows 媒体设备管理器构建的服务提供商)都为调用应用程序提供单个 API。
Windows 媒体设备管理器充当系统的三个主要组件:应用程序发出请求(信息、读取或写入数据等):安全内容提供程序,它是处理与 DRM 保护的文件通信的组件;和服务提供商,它接收来自应用程序的请求,并与设备通信以执行这些请求。 应用程序和服务提供商都构建在 Windows 媒体设备管理器 SDK 上。
下图显示了桌面应用程序如何使用 Windows 媒体设备管理器 11 与设备通信。
显示与四种不同类型的设备通信的应用程序的 
上图显示了与四种不同类型的设备通信的应用程序,每个设备都与其自己的服务提供商通信。 每个服务提供商旨在与特定类型的设备通信;此图显示了三个Microsoft提供的服务提供商(适用于大容量存储类设备、RAPI 设备和 MTP 设备的通用类驱动程序),以及由第三方构建的专有设备的自定义服务提供商。 设备连接时,Windows 媒体设备管理器实例化为该设备注册的服务提供程序的实例。 服务提供商通过它们实现的 Windows 媒体设备管理器接口从应用程序获取请求,使用适当的驱动程序与设备通信,并返回相应的结果。 服务提供商和设备之间的通信不在 Windows 媒体设备管理器的域中。
服务提供商对应用程序不可见;应用程序仅看到“设备”列表,因为 Windows 媒体设备管理器为所有设备公开了一组标准方法和接口。 如果制造商创建了自定义服务提供商,则必须在应用程序能够使用该设备时处理所有标准 Windows 媒体设备管理器方法。
此图还显示了安全内容提供程序(SCP)模块。 本模块负责处理受数字权限管理(DRM)保护的内容。 Microsoft提供了一个 SCP 模块,该模块可以处理受 DRM 保护的 WMA 和 WMV 文件。 如果应用程序或设备打算处理其他受保护的格式,则必须提供自己的 SCP 模块。 应用程序或服务提供商都不会直接处理 SCP。
应用程序和服务提供商都构建在 Windows 媒体设备管理器上,该管理器在应用程序和设备的适当服务提供商之间路由调用;服务提供商负责直接与设备通信。 Windows 媒体设备管理器确实执行某些作(例如枚举连接的设备、路由调用和处理组件验证):但是,大部分工作由服务提供商完成,后者接收来自应用程序的请求并与设备通信。
基于 Windows 媒体设备管理器构建的应用程序可以与基于早期版本的 Windows 媒体设备管理器构建的设备和服务提供商通信;但是,这些较旧的设备将运行 9 个系列组件(未显示),并且不支持最新功能,尤其是更先进的数字版权管理技术。
设备的体系结构
下图显示了使用 Windows 媒体设备管理器的应用程序看到的设备和存储的简化层次结构。
显示设备上的存储的 
上图显示了已连接的闪存驱动器的简化版本,如 Windows 媒体设备管理器应用程序所见。 闪存驱动器具有属性和属性,例如序列号和支持的格式配置。 闪存设备的直接子级是根存储对象,其中包含一个文件夹,该文件夹本身包含图像和歌曲。
应用程序通过调用根 IWMDeviceManager 接口公开的枚举方法来枚举附加设备的列表。 设备由 IWMDMDevice(或派生)接口表示。 此接口公开用于检索设备名称、格式功能、序列号等的方法,以及枚举设备上 存储 的方法。 在 Windows 媒体设备管理器中,存储是设备上的任何类型的对象,无论它是否是实际的数据 blob。 例如:音频文件、文本文件、文件夹、作为文件存储的播放列表和作为元数据存储的播放列表都被视为存储,即使文件夹和元数据项可能不表示物理文件。 可以通过调用 GetAttributes(或 GetMetadata(请求存储格式)来检索存储的类型(或格式)。
设备上的存储以分层方式存储,所有设备都有根存储。 每个存储都可以保存零个或多个子对象,通过调用该存储的 IWMDMStorage::EnumStorage 方法枚举。
请注意,关系图中的每个存储都有与其关联的属性和元数据(并非所有值都显示)。 属性很简单,布尔信息通常描述管理或导航信息(如“包含文件夹”或“可以删除”),而元数据可以是字符串值、数字或复杂信息(如呈现功能)。 特性由 SDK 定义的标志集进行描述,并通过调用 IWMDMStorage::GetAttributes 或 IWMDMStorage2::GetAttributes2进行检索。 元数据值由唯一名称检索;SDK 定义了设备应支持的多个元数据值,但设备可以定义其自己的 元数据常量。 但是,如果设备或服务提供商定义了新的元数据常量,则除非应用程序开发人员知道此新常量,否则应用程序将无法请求或设置此值。 服务提供商必须支持 IWMDMStorage3 或更高版本来支持检索或设置元数据。 有关详细信息,请参阅 获取和设置元数据和属性。
服务提供商
服务提供商充当应用程序和设备之间的中间人。 服务提供商对应用程序开发人员不可见,因此应用程序开发人员无需知道有关开发服务提供商的任何内容。 但是,它是执行与设备通信工作的服务提供商。
服务提供商是基于 Windows 媒体设备管理器构建的 COM DLL,它接收来自应用程序的请求并与设备通信以执行请求。 与桌面应用程序的通信由 Windows 媒体设备管理器进行调解;与设备的通信由服务提供商控制。
服务提供商接收来自应用程序的请求来枚举设备内容、设备功能请求、读取或写入数据的请求等。 它必须非常清楚设备的设计,以便它可以以正确的格式和协议发送命令。 它还应该能够隐藏特定于设备的要求,例如播放列表所需的文件扩展名,以便应用程序不需要知道这些要求才能使用设备。
Microsoft为标准设备类型提供许多服务提供商,包括通用 MTP 设备、大容量存储类设备和 RAPI 设备。 设备设计器需要创建自定义服务提供商的唯一原因是,如果设备具有标准服务提供商不处理的一些特定或不寻常的数据存储要求,例如,如果文件必须存储在特定位置,并且设备作系统不会自动处理这种情况。
当设备连接到计算机时,作系统会为每个 Windows 媒体设备管理器应用程序创建相应的服务提供商的一个实例。 如果第二个 Windows 媒体设备管理器应用程序启动,则会加载服务提供商的第二个实例。 但是,每个服务提供商都可以处理多个设备。 下图说明了这一点。
显示两个 mtp 设备与两个应用程序通信的 
上图显示了两个不同的应用程序与两个 MTP 设备通信。 设备使用相同的服务提供商类,但每个应用程序都有自己的同一服务提供商实例。 每个服务提供商实例都与设备通信。 服务提供商的不同实例彼此不知道。
许多应用程序方法具有相应的命名服务提供程序方法。 当应用程序调用方法时,Windows Media Device Manager 会将调用路由到服务提供商上的相应方法(尽管它可能先执行一些额外的内部作)。 例如,当应用程序调用 IWMDMDevice3::GetProperty时,Windows 媒体设备管理器会将此调用路由到服务提供商 IMDSPDevice3::GetProperty的实现。 (大多数应用程序接口都以 IWMDM 开头,相应的服务提供商接口以 IMDSP 开头)。 服务提供程序应处理此方法调用并返回适当的结果。
应用程序永远不会直接浏览或与设备通信(除非它调用 IWMDMDevice3::D eviceIoControl 或 IWMDMStorage::SendOpaqueCommand):应用程序与服务提供商通信,后者必须以最逻辑和最简单的方式表示设备。 当应用程序请求有关设备的信息或枚举设备上的对象时,服务提供商会以适当的方式查询设备,并获取并返回相应的信息。 它可能会公开设备上的文件组织,与在设备上物理上存储的方式不同(如果这合适)。 但是,它会公开设备,它应该以一致、逻辑的方式使应用程序能够找到它需要的内容并处理它发送的命令。 良好的服务提供商将隐藏特定于设备的特殊性,例如,如果设备以物理方式将播放列表存储为具有自定义文件扩展名的文件,则服务提供商应在应用程序在设备上创建播放列表时自动添加该扩展;它不应期望应用程序在创建播放列表对象时知道正确的扩展。
服务提供商在调用应用程序的进程内运行。 唯一的例外是 MTP 服务提供程序,它在其自己的进程中运行。 因此,阻止的服务提供程序会导致调用应用程序阻止存在一些风险。 因此,应将服务提供商设计为可靠且防止阻塞,并且应用程序应设计为避免在特定方法调用不快速返回时停止。
相关主题