IStorage::CopyTo 方法 (objidl.h)

CopyTo 方法将打开的存储对象的整个内容复制到另一个存储对象。

语法

HRESULT CopyTo(
  [in] DWORD     ciidExclude,
  [in] const IID *rgiidExclude,
  [in] SNB       snbExclude,
  [in] IStorage  *pstgDest
);

参数

[in] ciidExclude

rgiidExclude 指向的数组中的元素数。 如果 rgiidExcludeNULL,则 忽略 ciidExclude

[in] rgiidExclude

接口标识符数组 (IID) 调用方知道且不希望复制,或者存储对象不支持,但调用方稍后将显式复制其状态。 数组可以包含 IStorage(指示仅复制流对象)和 IStream(指示仅复制存储对象)。 数组长度为零表示仅复制 IStorage 对象公开的状态;对象上的所有其他接口将被忽略。 传递 NULL 表示要复制对象上的所有接口。

[in] snbExclude

字符串名称块 (引用 SNB) ,该块指定不复制到目标的存储或流对象块。 这些元素不是在目标位置创建的。 如果 rgiidExclude 数组中IID_IStorage,则忽略此参数。 此参数可以为 NULL

[in] pstgDest

指向要向其复制此存储对象的打开存储对象的指针。 目标存储对象可以是与源存储对象不同的 IStorage 接口实现。 因此, IStorage::CopyTo 只能使用目标存储对象的公开可用方法。 如果 pstgDest 在事务处理模式下打开,可以通过调用其 IStorage::Revert 方法还原它。

返回值

此方法可以返回其中一个值。

返回代码 说明
S_OK 已成功复制存储对象。
E_PENDING 仅限异步存储:要复制的部分或全部数据当前不可用。
STG_E_ACCESSDENIED 目标存储对象是源存储对象的子级。
STG_E_INSUFFICIENTMEMORY 由于内存不足,复制未完成。
STG_E_INVALIDPOINTER 为存储对象指定的指针无效。
STG_E_INVALIDPARAMETER 其中一个参数无效。
STG_E_TOOMANYOPENFILES 未完成复制,因为打开的文件太多。
STG_E_REVERTED 事务树中存储对象上方的还原操作已失效。
STG_E_MEDIUMFULL 复制未完成,因为存储介质已满。

注解

此方法将源存储对象中包含的元素与目标中已存在的元素合并。 目标存储对象的布局可能与源存储对象不同。

复制过程是递归的,对源中嵌套的元素调用 IStorage::CopyToIStream::CopyTo

在具有相同名称的现有流上复制流时,将首先删除现有流,然后将其替换为源流。 在具有相同名称的现有存储上复制存储时,不会删除现有存储。 因此,在复制操作之后,目标 IStorage 包含较旧的元素,除非它们被具有相同名称的较新元素替换。

存储对象可能公开 IStorage 以外的接口,包括 IRootStorageIPropertyStorageIPropertySetStoragergiidExclude 参数允许从复制操作中排除任何或所有这些附加接口。

具有现有子存储或流对象的更新或更有效的副本的调用方可能希望从复制操作中排除这些对象的当前版本。 snbExcludergiidExclude 参数提供两种排除现有存储或流的存储对象的方法。

对调用方的说明

使用 IStorage::CopyTo 方法的最常见方法是将源中的所有内容复制到目标,就像大多数完全保存和另存为操作一样。

以下示例代码演示如何将源存储对象的所有内容复制到目标存储对象。

pstg->CopyTo(0, Null, Null, pstgDest)
注意 若要压缩文档文件,请对根存储对象调用 CopyTo ,并复制到新的存储对象。
 

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 objidl.h
Library Uuid.lib
DLL Ole32.dll

另请参阅

IStorage - 复合文件实现

IStorage::MoveElementTo

IStorage::Revert