IMAPIProp::CopyTo
The IMAPIProp::CopyTo
method copies or moves all properties, except for specifically excluded
properties.
Quick Info
See IMAPIProp
: IUnknown
HRESULT CopyTo(
ULONG ciidExclude, |
|
LPCIID rgiidExclude, |
|
LPSPropTagArray lpExcludeProps, |
|
ULONG ulUIParam,
|
|
LPMAPIPROGRESS lpProgress,
|
|
LPCIID lpInterface, |
|
LPVOID lpDestObj,
|
|
ULONG ulFlags,
|
|
LPSPropProblemArray FAR * lppProblems |
|
) |
|
Parameters
ciidExclude
[in] Count of
interfaces to exclude when copying or moving properties.
rgiidExclude
[in] Array of
interface identifiers (IIDs) indicating interfaces that should not be used when
copying or moving supplemental information to the destination object.
lpExcludeProps
[in] Pointer
to a property tag array identifying the property tags that should be excluded
from the copy or move operation. Passing NULL in the lpExcludeProps
parameter indicates that all of the object s properties should be copied or
moved. CopyTo returns MAPI_E_INVALID_PARAMETER when the cValues member
of the SPropTagArray structure pointed to by lpExcludeProps is
set to zero.
ulUIParam
[in] Handle
of the parent window for the progress indicator.
lpProgress
[in] Pointer
to a progress indicator implementation. If NULL is passed in the lpProgress
parameter, MAPI provides the progress implementation. The lpProgress
parameter is ignored unless the MAPI_DIALOG flag is set in the ulFlags
parameter.
lpInterface
[in] Pointer
to the interface identifier (IID) representing the interface to be used to
access the object pointed to by lpDestObj. The lpInterface parameter
must not be NULL.
lpDestObj
[in] Pointer
to the object to receive the copied or moved properties.
ulFlags
[in] Bitmask
of flags that controls the copy or move operation. The following flags can be
set:
MAPI_DECLINE_OK
If the CopyTo
calls IMAPISupport::DoCopyTo to handle the copy or move operation, it
should instead return immediately with the error value MAPI_E_DECLINE_COPY. The
MAPI_DECLINE_OK flag is set by MAPI to limit recursion. Clients do not set this
flag.
MAPI_DIALOG
Allows the
display of a progress indicator.
MAPI_MOVE
CopyTo should perform a move operation rather than a copy
operation. When this flag is not set, CopyTo performs a copy operation.
MAPI_NOREPLACE
Existing
properties in the destination object should not be overwritten. When this flag
is not set, CopyTo overwrites existing properties.
lppProblems
[in, out] On
input, can be NULL, indicating no need for error information, or a pointer to a
pointer to an SPropProblemArray
Return Values
S_OK
The
properties have been successfully copied or moved.
MAPI_E_COLLISION
A subobject
cannot be copied because there is already an subobject existing in the
destination object with the same display name (PR_DISPLAY_NAME
MAPI_E_DECLINE_COPY
The service
provider does not implement the copy operation.
MAPI_E_FOLDER_CYCLE
The source
object performing the copy or move operation directly or indirectly contains
the destination object. Significant work might have been performed before this
condition was discovered, so the source and destination objects might be
partially modified.
MAPI_E_INTERFACE_NOT_SUPPORTED
The interface
identified by the lpInterface parameter is not supported by the
destination object.
MAPI_E_NO_ACCESS
An attempt
was made to access an object for which the caller has insufficient permissions.
This error is returned if the destination object is the same as the source
object.
The following
values can be returned in the SPropProblemArray
MAPI_E_BAD_CHARWIDTH
Either the MAPI_UNICODE
flag was set and CopyTo does not support Unicode, or MAPI_UNICODE was
not set and CopyTo only supports Unicode.
MAPI_E_COMPUTED
The property
cannot be modified by the caller because it is a read-only property, computed
by the owner of the destination object. This error is not severe; the caller
should allow the copy operation to continue.
MAPI_E_INVALID_TYPE
The property
type is invalid.
MAPI_E_UNEXPECTED_TYPE
The property
type is not the type expected by the caller.
Remarks
The IMAPIProp::CopyTo
method by default copies or moves all of the current object s properties to a
destination object. CopyTo is used when an object should be copied or
moved exactly, with all or most of its properties intact.
Any
subobjects in the source object are automatically included in the operation and
copied or moved in their entirety. CopyTo by default overwrites any
properties in the destination object that match properties from the source
object. If any of the copied or moved properties already exist in the destination
object, the existing properties are overwritten by the new, unless the
MAPI_NOREPLACE flag is set in the ulFlags parameter. Existing
information in the destination object that is not overwritten is left untouched.
Notes to Implementers
You can provide
a full implementation of CopyTo or rely on the implementation that MAPI
provides in its support object. If you want to use the MAPI implementation,
call IMAPISupport::DoCopyTo
Because the
copy operation can be lengthy, you are encouraged to display a progress
indicator. Use the IMAPIProgress implementation passed in the lpProgress
parameter, if there is one. If lpProgress is NULL, call IMAPISupport::DoProgressDialog to use the MAPI
implementation.
Do not
attempt to set any known read-only properties in the destination object; return
MAPI_E_NO_ACCESS instead.
The source
and destination objects should use the same interfaces. Return
MAPI_E_INVALID_PARAMETER if lpInterface is not set.
Return
MAPI_E_INTERFACE_NOT_SUPPORTED if all known interfaces are excluded.
Notes to Callers
Do not set
the MAPI_DECLINE_OK flag; it is used by MAPI in its calls to message store
provider CopyTo implementations.
Because copy
and move operations can take time, it is wise to request the display of a
progress indicator by setting the MAPI_DIALOG flag. You can set the lpProgress
parameter to your implementation of IMAPIProgress
You can
suppress the display of a progress indicator by not setting the MAPI_DIALOG
flag. CopyTo will ignore the ulUIParam and lpProgress
parameters and avoid displaying the indicator.
CopyTo can report global and individual errors, or errors
that occur with one or more properties. These individual errors are placed in
an SPropProblemArray
If you want
to receive information about errors, pass a valid SPropProblemArray
structure pointer in the lppProblems parameter. When CopyTo
returns S_OK, check for possible errors with individual properties in the
structure. When CopyTo returns an error, no information is returned in
the SPropProblemArray structure. Instead, call IMAPIProp::GetLastError
If CopyTo
returns S_OK, free the returned SPropProblemArray structure by calling
the MAPIFreeBuffer
If you are
copying properties that are unique to the source object type, you must be sure
that the destination object is of the same type. CopyTo does not prevent
you from associating properties that typically belong to one type of object
with another type of object. It is up to you to copy properties that make sense
for the destination object. For example, you should not copy message properties
to an address book container.
To ensure
that you are copying between objects of the same type, check that the source
and destination object are the same type, either by comparing object pointers
or calling IUnknown::QueryInterface. Set the interface identifier
pointed to by lpInterface to the standard interface for the source
object. Also, make sure that the object type or PR_OBJECT_TYPE property is the same for the two objects. For example, if you are copying from
a message, set lpInterface to IID_IMessage and the PR_OBJECT_TYPE for
both objects to MAPI_MESSAGE.
If an invalid
pointer is passed in the lpDestObj parameter, the results are
unpredictable.
Excluding
properties on a CopyTo call can be useful. For example, some objects
have properties that are specific to a single instance of the object, such as
the date and time of message delivery. To avoid copying a message s delivery
time when copying the message to a different folder, specify PR_MESSAGE_DELIVERY_TIME
Similarly,
prevent the copying or moving of a folder or address book container s hierarchy
or contents table by including PR_CONTAINER_HIERARCHY
To exclude
properties from the copy or move operation, include their property tags in the lpExcludeProps
parameter. If you pass the results of using the PROP_TAG macro to build a
property tag from a specific identifier in the property tag array, all
properties with that identifier will be excluded. For example, the following
entry in the property tag array causes all properties with an identifier of
0x8002 to be excluded, regardless of type:
PROP_TAG(PT_LONG, 0x8002)
The PR_NULL
The
usefulness of the CopyTo feature for excluding interfaces is perhaps not
as obvious as the usefulness of excluding properties. You can exclude an interface
when copying to an object that has no knowledge of a group of properties. For
example, if you are copying properties from a folder to an attachment, the only
properties that the attachment will be able to work with are the generic
properties accessible with any IMAPIProp implementation. By excluding IMAPIFolder
from the copy operation, the attachment will not receive any of the more
specific folder properties.
When you use
the rgiidExclude parameter to exclude an interface, it also excludes all
interfaces derived from that interface. For example, excluding IMAPIContainer
causes folders or address book containers to be excluded, depending on the type
of provider. Do not exclude IMAPIProp or IUnknown because so many
interfaces derive from them.
Ignore
MAPI_E_COMPUTED errors returned in the SPropProblemArray structure in
the lppProblems parameter.
See Also