Поделиться через


IMAPIProp::SaveChanges

Область применения: Outlook 2013 | Outlook 2016

Вносит постоянные изменения, внесенные в объект с момента последней операции сохранения.

HRESULT SaveChanges(
  ULONG ulFlags
);

Параметры

ulFlags

[в] Битовая маска флагов, управляющая тем, что происходит с объектом при вызове метода IMAPIProp::SaveChanges . Можно задать следующие флаги:

NON_EMS_XP_SAVE

Указывает, что сообщение не доставлено из Microsoft Exchange Server. Этот флаг следует использовать в сочетании с методом IMAPIFolder::CreateMessage и флагом ITEMPROC_FORCE, чтобы указать PST-хранилищу, что сообщение может обрабатываться правилами до того, как хранилище файлов личных папок (PST) уведомляет любой прослушивающий клиент о получении сообщения. Обработка правил применяется только к новым сообщениям, созданным с помощью IMAPIFolder::CreateMessage на сервере, который не является Exchange Server. В этом случае Exchange Server уже обработал бы правила для сообщения.

FORCE_SAVE

Изменения должны быть записаны в объект , переопределяя все предыдущие изменения, внесенные в объект, и объект должен быть закрыт. Для успешного выполнения операции необходимо задать разрешение на чтение и запись. Флаг FORCE_SAVE используется после того, как предыдущий вызов SaveChanges вернул MAPI_E_OBJECT_CHANGED.

KEEP_OPEN_READONLY

Изменения должны быть зафиксированы, а объект должен быть открыт для чтения. Никаких дополнительных изменений вноситься не будет.

KEEP_OPEN_READWRITE

Изменения должны быть зафиксированы, а объект должен оставаться открытым для разрешения на чтение и запись. Этот флаг обычно устанавливается при первом открытии объекта для разрешения на чтение и запись. Последующие изменения объекта допускаются.

MAPI_DEFERRED_ERRORS

Позволяет saveChanges успешно вернуться, возможно, до полной фиксации изменений.

SPAMFILTER_ONSAVE

Включает фильтрацию нежелательной почты в сохраняемом сообщении. Поддержка фильтрации нежелательной почты доступна только в том случае, если тип адреса электронной почты отправителя соответствует протоколу SMTP, а сообщение сохранено в хранилище для файлов личных папок (PST).

Возвращаемое значение

S_OK

Приверженность изменениям была успешной.

MAPI_E_NO_ACCESS

SaveChanges не может держать объект открытым для разрешения только для чтения, если задано KEEP_OPEN_READONLY, или разрешение на чтение и запись, если задано KEEP_OPEN_READWRITE. Изменения не фиксируются.

MAPI_E_OBJECT_CHANGED

Объект изменился с момента его открытия.

MAPI_E_OBJECT_DELETED

Объект был удален с момента его открытия.

Замечания

Метод IMAPIProp::SaveChanges делает изменения свойств постоянными для объектов, поддерживающих модель транзакций обработки, таких как сообщения, вложения, контейнеры адресной книги и объекты пользователей обмена сообщениями. Объекты, не поддерживающие транзакции, такие как папки, хранилища сообщений и разделы профилей, немедленно вносят изменения. Вызов SaveChanges не требуется.

Так как поставщикам служб не нужно создавать идентификатор записи для своих объектов, пока не будут сохранены все свойства, свойство объекта PR_ENTRYID (PidTagEntryId) может быть недоступно до вызова метода SaveChanges . Некоторые поставщики ожидают, пока в вызове SaveChanges не будет установлен флаг KEEP_OPEN_READONLY. KEEP_OPEN_READONLY указывает, что изменения, которые будут сохранены в текущем вызове, будут последними изменениями, которые будут внесены в объект .

Некоторые реализации хранилища сообщений не отображают новые сообщения в папке, пока клиент не сохранит изменения сообщения с помощью SaveChanges и не освободит объекты сообщений с помощью метода IUnknown::Release . Кроме того, некоторые реализации объектов не могут создать свойство PR_ENTRYID для вновь созданного объекта до тех пор, пока не будет вызван метод SaveChanges , а некоторые могут сделать это только после вызова SaveChanges с помощью KEEP_OPEN_READONLY, заданного в ulFlags.

Примечания для исполнителей

Если вы получили флаг KEEP_OPEN_READONLY, вы можете оставить доступ к объекту для чтения и записи. Однако поставщик никогда не может оставить объект в состоянии только для чтения при передаче флага KEEP_OPEN_READWRITE.

Когда клиент сохраняет несколько вложений в несколько сообщений, он вызывает метод SaveChanges для каждого вложения и каждого сообщения. Часто клиенты задают MAPI_DEFERRED_ERRORS для каждого из этих вызовов, кроме последнего. Вы можете возвращать ошибки при последнем или более ранних вызовах. Флаг можно даже игнорировать.

Если KEEP_OPEN_READWRITE или KEEP_OPEN_READONLY заданы вместе с MAPI_DEFERRED_ERRORS, запрос на отсрочку ошибок можно игнорировать. Если MAPI_DEFERRED_ERRORS не задано в ulFlags, для вызова SaveChanges можно вернуть одну из ранее отложенных ошибок.

То, предоставляет ли удаленный поставщик транспорта функциональную реализацию этого метода, является необязательным и зависит от других вариантов проектирования в вашей реализации. Если вы реализуете этот метод, сделайте это в соответствии с документацией здесь. Так как объекты папок и объекты состояния не выполняются, как минимум реализация SaveChanges удаленного поставщика транспорта должна возвращать S_OK, фактически не выполняя никаких действий.

Примечания для вызывающих методов

Если клиент передает KEEP_OPEN_READONLY, вызывает метод IMAPIProp::SetProps , а затем снова вызывает SaveChanges , то та же реализация может завершиться ошибкой.

После получения MAPI_E_NO_ACCESS от вызова, в котором вы задали KEEP_OPEN_READWRITE, вы по-прежнему будете иметь разрешение на чтение и запись для объекта . Вы можете снова вызвать SaveChanges , передав флаг KEEP_OPEN_READONLY или без флагов с KEEP_OPEN_SUFFIX.

То, поддерживает ли поставщик флаг KEEP_OPEN_READWRITE, зависит от реализации поставщика.

Чтобы указать, что единственным вызовом объекта после SaveChanges является IUnknown::Release, не устанавливайте флаги для параметра ulFlags . Ошибка из SaveChanges указывает, что не удалось сделать ожидающие изменения постоянными. Разные поставщики по-разному обрабатывают отсутствие флагов при вызове SaveChanges . Некоторые поставщики обрабатывают это состояние так же, как KEEP_OPEN_READONLY; другие поставщики интерпретируют его так же, как и KEEP_OPEN_READWRITE. Другие поставщики завершают работу объекта, если не получают флаги при вызове SaveChanges .

Некоторые свойства, обычно вычисляемые свойства, не могут быть обработаны до тех пор, пока вы не вызовете SaveChanges , а в некоторых случаях — Release.

При внесении массовых изменений, таких как сохранение вложений в несколько сообщений, отложите обработку ошибок, установив флаг MAPI_DEFERRED_ERRORS в ulFlags. При сохранении нескольких вложений в несколько сообщений выполните один вызов SaveChanges для каждого вложения и один вызов SaveChanges для каждого сообщения. Установите флаг MAPI_DEFERRED_ERRORS для каждого вызова вложения и для всех сообщений, кроме последнего.

Если Функция SaveChanges возвращает MAPI_E_OBJECT_CHANGED, проверка, был ли изменен исходный объект. Если это так, предупредите пользователя, который может либо запросить, чтобы изменения перезаписыли предыдущие изменения, либо сохранить объект в другом месте. Если исходный объект был удален, предупредите пользователя, чтобы предоставить ему возможность сохранить объект в другом расположении.

Вы не можете вызвать SaveChanges с флагом FORCE_SAVE для удаленного открытого объекта.

Если SaveChanges возвращает ошибку, объект, изменения которого должны были быть сохранены, остается открытым независимо от флагов, заданных в параметре ulFlags .

Важно!

UlFlags NON_EMS_XP_SAVE и SPAMFILTER_ONSAVE могут не быть определены в текущем загружаемом файле заголовка. В этом случае его можно добавить в код, используя следующие значения:#define SPAMFILTER_ONSAVE ((ULONG) 0x00000080)>#define NON_EMS_XP_SAVE ((ULONG) 0x00001000)

Дополнительные сведения см. в разделе Сохранение свойств MAPI.

См. также

IMAPIProp::SetProps
Каноническое свойство PidTagEntryId
IMAPIProp : IUnknownсохранение свойств MAPI