IStream 接口
https://msdn.microsoft.com/en-us/library/windows/apps/aa380034
IStream接口允许您读取和写入 stream 对象的数据。流对象包含结构化的存储对象,存贮在哪里提供结构中的数据。简单的数据可以直接写入流,但最频繁,溪流是元素嵌套在一个存储对象。他们是类似于标准的文件。
IStream接口定义方法类似于的 MS-DOS 脂肪的文件功能。例如,每个流对象都有其自己的访问权限和查找指针。DOS 文件和流对象之间的主要区别是,在后者的情况下,流打开使用IStream接口指针,而不是一个文件句柄。
此接口中的方法呈现您的对象的数据作为一系列连续的你可以读取或写入的字节数。也有犯下和恢复是开放在事务处理的模式和方法来限制访问到某个范围的字节流中的流上更改方法。
溪流而无需占用文件系统资源的较长时间内可以保持打开状态。IUnknown::Release方法是类似于文件上的关闭功能。一旦释放,流对象将不再有效,不能使用。
客户端的异步名字对象可以选择之间数据推送或数据抽取的模型驱动异步IMoniker::BindToStorage操作和接收异步通知。更多的信息,请参阅URL 名字对象。下表比较行为的异步ISequentialStream::Read和IStream::Seek调用中这两个在IBindStatusCallback::OnDataAvailable返回下载模型︰
IStream 方法调用 | 数据拉入模型中的行为 | 数据推送模型中的行为 |
---|---|---|
读取 Read 被调用来读取部分数据 (也就是说,并不是所有的可用数据) | 返回 S_OK。客户端必须继续从IBindStatusCallback::OnDataAvailable返回之前读取所有可用的数据,否则绑定操作被阻止。(那就是,读取,直到返回 S_FALSE 或 E_PENDING) | 返回 S_OK。即使客户端返回从IBindStatusCallback::OnDataAvailable在这一点上绑定操作继续和IBindStatusCallback::OnDataAvailable将再次调用多次,直到绑定完成。 |
读取 Read 被调用来读取所有可用的数据 | 如果尚未完成绑定操作,和更多的数据可用时,将再次调用IBindStatusCallback::OnDataAvailable将返回 E_PENDING。 | 数据拉入模型相同。 |
读取 Read 被调用来读取所有可用的数据和绑定操作已经结束 (结束的文件) | 返回 S_FALSE。将grfBSC标记设置为 BSCF_LASTDATANOTIFICATION 到IBindStatusCallback::OnDataAvailable的后续调用。 | 数据拉入模型相同。 |
被称为Seek | 寻求在数据拉模型无法正常工作 | 寻求并不适用于数据推模型。 |
有关此主题的一般信息,请参阅异步名字对象和数据拉模型与数据推模型更具体的信息。请参阅管理内存分配有关 COM 的规则来管理内存的详细信息。
当执行
当您需要不提供 COM 复合文件实现功能时容器或对象应用程序上实现IStream 。IStream该规范定义了更多的功能比 COM 执行支持。此外,如果您正在创建大于你的机器内存中堆的流对象和您正在使用的全局内存句柄,复合文件执行GlobalReAlloc在内部调用每当它需要更多的内存,可以是非常低效。在这种情况下,首选的解决方案是实现IStream使用由VirtualAlloc GlobalAlloc而分配的内存。这可以保留大量的虚拟地址空间,然后提交作为所需地址空间中的内存。没有数据复制发生和内存是承诺,它需要时才。更多的信息,请参阅IStream-复合文件执行。
IStream接口从ISequentialStream继承了读和写的方法。
注意大多数容器不实现ISequentialStream作为一个单独的接口,你并不需要分别提供它,即使您提供IStream执行。例如的复合文件实现的结构化存储为ISequentialStream不成功调用方法,但它包括通过IStream接口指针的读和写的方法。
何时使用
从一个容器或应用程序来读取和写入对象的数据调用IStream接口的方法。因为流对象可以封送到其他进程,应用程序可以共享存储对象中的数据,而无需使用全局内存。
成员
IStream接口从IUnknown接口继承。IStream也有这些类型的成员︰
方法
IStream接口具有这些方法。
显示︰继承保护
方法 | 描述 |
---|---|
克隆 Clone |
创建一个新的流对象引用原来相同的字节流,但提供一个单独的寻求那些字节的指针。 |
提交 Commit |
确保做一个 stream 对象在事务处理模式中打开的任何更改都反映在父存储对象。 |
CopyTo |
复制指定的数目的字节从当前查找指针在当前流寻求另一个流中的指针。 |
LockRegion |
限制到指定的流中的字节范围的访问。支持这项功能是可选的因为一些文件系统不提供它。 |
读 Read |
读取指定的数目的字节从流对象读入内存起价当前查找指针。 (从ISequentialStream的继承) |
还原 Revert |
放弃自上次调用IStream::Commit对事务处理流进行的所有更改。 |
寻求 Seek |
将查找指针更改到新的位置相对于开始的流,流或当前查找指针的结尾。 |
SetSize |
更改流对象的大小。 |
统计 Stat |
检索此流的STATSTG结构。 |
UnlockRegion |
移除以前限制与IStream::LockRegion的字节范围的访问限制。 |
写 Write |
写入指定的起价当前的流对象的字节数查找指针。 (从ISequentialStream的继承) |