手动处理文件传输

你的应用程序可以实现 IWMDMOperation 接口来管理读取或写入过程的一部分。 在从设备读取时,实现使应用程序能够从设备文件接收原始数据块。 在写入设备时,应用程序可以将原始数据块发送到设备上的文件。

在读写操作中,IWMDMOperation::TransferObjectData 方法在计算机与设备之间传递数据。 若要了解数据传输的方向,应用程序必须在 Windows Media 设备管理器调用 BeginReadBeginWrite 时设置标志。 调用 End 方法时,应用程序应重置此标志。

注意

如果服务提供商和设备正确实现 IMDSPObject2,它会先调用应用程序的 IWMDMOperation3::TransferObjectDataOnClearChannel 方法(如已实现)。 此方法是传输数据的更高效方法。 TransferObjectDataOnClearChannel 的处理方式与 TransferObjectData 相同,但数据从不加密,也没有要验证的 MAC 值。

 

以下部分介绍在应用程序实现 IWMDMOperation 时的读取和写入过程。

从设备读取

从设备读取文件时,Windows Media 设备管理器按顺序调用以下 IWMDMOperation 方法:

  • 调用 BeginRead 以通知应用程序从设备读取开始。
  • 调用 TransferObjectData 一次或多次。 以下步骤中描述了数据的处理:
    1. TransferObjectData 接收大小为 pdwSize 字节、填充了数据的缓冲区 pData,以及用于验证传入数据的 MAC。
    2. 应用程序使用传入数据 MAC 验证传入参数。
    3. 应用程序解密并读取 pData 中尽可能多的数据,并修改 pdwSize 的返回值,以指示实际读取的字节数。
    4. 应用程序使用 CSecureChannelClient::DecryptParam 解密数据,并根据需要存储或使用它。
    5. TransferObjectData 返回 S_OK。
    6. Windows Media 设备管理器继续调用 TransferObjectData,直到应用程序从文件读取所有数据,或者应用程序返回 WMDM_E_USER_CANCELLED 以取消操作(在这种情况下,读取已取消,并且 Windows Media 设备管理器调用结束)。
  • 调用 BeginRead 以通知应用程序从设备读取结束。

写入设备

向设备写入文件时,Windows Media 设备管理器按顺序调用以下 IWMDMOperation 方法:

  • 调用 GetObjectName 以允许应用程序指定新存储的名称。 仅当应用程序未在 Insert 方法中指定名称时才调用此方法。
  • 调用 GetObjectAttributes 以允许应用程序为设备上的新存储指定属性。
  • 调用 BeginWrite 以通知写入设备开始。
  • 调用 GetObjectTotalSize 以检索写入设备的对象的总大小,以启用传输优化,并让 Windows Media 设备管理器有机会在文件对设备过大时取消传输。
  • 调用 TransferObjectData 一次或多次。 以下步骤中描述了数据的处理:
    1. TransferObjectData 接收指向大小为 pdwSize 字节的缓冲区的指针。
    2. 应用程序获取要发送到设备的数据块,通常是采取从文件读取数据的方法,并在接收的缓冲区中填充最多 pdwSize 个字节。 它应修改 pdwSize(如有必要),以反映添加到缓冲区的字节数。
    3. 应用程序创建所有方法参数的 MAC。
    4. 应用程序使用 CSecureChannelClient::EncryptParam 加密缓冲区中的数据。
    5. TransferObjectData 返回 S_OK 以指示有更多的数据,或返回 S_FALSE 以指示没有更多数据。 如果应用程序返回 WMDM_E_USER_CANCELLED,写入操作会取消,并且 Windows Media 设备管理器将调用 End
    6. 只要应用程序返回 S_OK,Windows Media 设备管理器将继续调用 TransferObjectData
  • 调用 End 以通知写入设备结束。

有关代码示例,请参阅加密和解密

创建 Windows Media 设备管理器应用程序