IStorage::CopyTo
Copies the
entire contents of an open storage object to another storage object.
HRESULT CopyTo(
DWORD ciidExclude, |
//Number
of elements in rgiidExclude |
IID const * rgiidExclude, |
//Array
of interface identifiers (IIDs) |
SNB snbExclude, |
//Points
to a block of stream names in the storage object |
IStorage * pstgDest |
//Points
to destination storage object |
); |
|
Parameters
ciidExclude
[in] The
number of elements in the array pointed to by rgiidExclude. If rgiidExclude
is NULL, then ciidExclude is ignored.
rgiidExclude
[in] An array
of interface identifiers that either the caller knows about and does not want
to be copied or that the storage object
does not support but whose state the caller will later explicitly copy. The
array can include IStorage, indicating that only stream objects are to
be copied, and IStream, indicating that only storage objects are to be
copied. An array length of zero indicates that only the state exposed by the IStorage object is to be copied; all
other interfaces on the object are to be ignored. Passing NULL indicates that
all interfaces on the object are to be copied.
snbExclude
[in] A string
name block (refer to SNB
pstgDest
[in] Points
to the open storage object into which this storage object is to be copied. The
destination storage object can be a different implementation of the IStorage
Return Values
S_OK
The storage
object was successfully copied.
E_PENDING
Asynchronous
Storage only: Part or all of the data to be copied is currently unavailable.
For more information see IFillLockBytes
STG_E_ACCESSDENIED
The
destination storage object is a child of the source storage object.
STG_E_INSUFFICIENTMEMORY
The copy was
not completed due to a lack of memory.
STG_E_INVALIDPOINTER
The pointer
specified for the storage object was invalid.
STG_E_INVALIDPARAMETER
One of the
parameters was invalid.
STG_E_TOOMANYOPENFILES
The copy was
not completed because there are too many open files.
STG_E_REVERTED
The storage
object has been invalidated by a revert operation above it in the transaction
tree.
STG_E_MEDIUMFULL
The copy was
not completed because the storage medium is full.
Remarks
This method
merges elements contained in the source storage object with those already
present in the destination. The layout of the destination storage object may
differ from the source storage object.
The copy
process is recursive, invoking IStorage::CopyTo and IStream::CopyTo
When copying
a stream on top of an existing stream with the same name, the existing stream
is first removed and then replaced with the source stream. When copying a storage on top of an existing
storage with the same name, the existing storage is not removed. As a result,,
after the copy operation, the destination IStorage contains older elements,
unless they were replaced by newer ones with the same names.
A storage
object may expose interfaces other than IStorage, including IRootStorage,
IPropertyStorage, or IPropertySetStorage. The rgiidExclude parameter provides a
way to exclude any or all of these additional interfaces from the copy
operation.
A caller with
a newer or more efficient copy of an existing substorage or stream object may
want to exclude the current versions of these objects from the copy operation.
The snbExclude and rgiidExclude parameters provide two different
ways of excluding a storage objects existing storages or streams.
Note to Callers
The most
common way to use this method is to copy everything possible from the source to
the destination, as in most Full Save and SaveAs operations. The following
example illustrates this call:
pstg->CopyTo(0, Null, Null, pstgDest)
See Also