手动处理文件传输
应用程序可以实现 IWMDMOperation 接口来管理读取或写入过程的一部分。 在从设备读取时,实现使应用程序能够接收来自设备文件的原始数据块。 在写入设备时,它使应用程序能够将原始数据块发送到设备上的文件。
在读写操作中, IWMDMOperation::TransferObjectData 方法在计算机和设备之间传递数据。 若要了解数据传输的方向,应用程序必须在Windows媒体设备管理器调用 BeginRead 或 BeginWrite 时设置标志。 调用 End 方法时,应用程序应重置此标志。
注意
如果服务提供商和设备正确实现 IMDSPObject2,它将首先调用应用程序的 IWMDMOperation3::TransferObjectDataOnClearChannel 方法(如果实现)。 此方法是一种更高效的数据传输方式。 TransferObjectDataOnClearChannel 的处理方式与 TransferObjectData 相同,只不过数据从未加密且没有要验证的 MAC 值。
以下部分介绍了在应用程序实现 IWMDMOperation 时读取和写入过程。
从设备读取
从设备读取文件时,Windows媒体设备管理器按顺序调用以下 IWMDMOperation 方法:
- BeginRead 调用以通知应用程序从设备开始读取。
- TransferObjectData 调用一次或多次。 以下步骤介绍了数据的处理:
- TransferObjectData 接收一个缓冲区、 pData、大小 pdwSize 字节、填充数据以及 MAC 来验证传入的数据。
- 应用程序使用传入数据 MAC 验证传入参数。
- 应用程序解密并读取 pData 中尽可能多的数据,并修改 pdwSize 的返回值,以指示实际读取的字节数。
- 应用程序使用 CSecureChannelClient::D ecryptParam 解密数据,并根据需要存储或使用它。
- TransferObjectData 返回S_OK。
- Windows媒体设备管理器继续调用 TransferObjectData,直到应用程序已从文件读取所有数据,否则应用程序返回WMDM_E_USER_CANCELLED以取消读取操作 (,Windows Media 设备管理器调用 End) 。
- 结束 调用以通知应用程序从设备读取结束。
写入设备
将文件写入设备时,Windows Media 设备管理器按顺序调用以下 IWMDMOperation 方法:
- GetObjectName 调用以允许应用程序为新存储指定名称。 仅当应用程序未在 Insert 方法中指定名称时,才调用此方法。
- GetObjectAttributes 调用以允许应用程序为设备上的新存储指定属性。
- BeginWrite 调用以通知写入设备已开始。
- GetObjectTotalSize调用以检索写入到设备的对象的总大小,以启用传输优化,并给Windows媒体设备管理器一个机会,以便在文件太大时取消传输。
- TransferObjectData 调用一次或多次。 以下步骤介绍了数据的处理:
- TransferObjectData 接收指向大小 为 pdwSize 字节的缓冲区的指针。
- 应用程序获取一个要发送到设备的数据块,通常是通过从文件读取数据,并用高达 pdwSize 字节填充接收的缓冲区。 ) 如有必要,它应修改 pdwSize (,以反映已添加到缓冲区的字节数。
- 应用程序创建所有方法参数的 MAC。
- 应用程序使用 CSecureChannelClient::EncryptParam 加密缓冲区中的数据。
- TransferObjectData 返回S_OK指示数据更多,或S_FALSE指示没有更多数据。 如果应用程序返回WMDM_E_USER_CANCELLED,将取消写入操作,Windows媒体设备管理器将调用 End。
- 只要应用程序返回S_OK,Windows媒体设备管理器将继续调用 TransferObjectData。
- 结束 调用以通知写入设备即将结束。
有关代码示例,请参阅 加密和解密。
相关主题