共用方式為


IMAPIProp::SaveChanges

適用於:Outlook 2013 |Outlook 2016

在上次儲存作業之後,對物件所做的任何變更都永久化。

HRESULT SaveChanges(
  ULONG ulFlags
);

參數

ulFlags

[in]旗標的位掩碼,控制呼叫 IMAPIProp::SaveChanges 方法時對象會發生什麼情況。 您可以設定下列旗標:

NON_EMS_XP_SAVE

表示訊息尚未從 Microsoft Exchange Server 傳遞。 此旗標應與 IMAPIFolder::CreateMessage 方法和 ITEMPROC_FORCE 旗標搭配使用,以向 PST 存放區指出,在 PST) 存放區 (個人資料夾檔案之前,訊息符合規則處理的資格,) 存放區會通知任何接聽用戶端訊息已抵達。 此規則處理僅適用於非 Exchange Server 伺服器上使用 IMAPIFolder::CreateMessage 建立的新訊息,在此情況下,Exchange Server 會已經處理訊息的規則。

FORCE_SAVE

變更應該寫入物件,覆寫先前對物件所做的任何變更,而且應該關閉物件。 必須設定讀取/寫入許可權,作業才能成功。 在先前對 SaveChanges 的呼叫傳回MAPI_E_OBJECT_CHANGED之後,會使用 FORCE_SAVE 旗標。

KEEP_OPEN_READONLY

應認可變更,且物件應保持開啟以供讀取。 不會進行其他變更。

KEEP_OPEN_READWRITE

應認可變更,且物件應保持開啟以取得讀取/寫入許可權。 這個旗標通常是在第一次開啟物件以取得讀取/寫入許可權時設定。 允許後續對 對象進行變更。

MAPI_DEFERRED_ERRORS

允許 SaveChanges 成功傳回,可能在完全認可變更之前。

SPAMFILTER_ONSAVE

在正在儲存的郵件上啟用垃圾郵件篩選。 只有當寄件者的電子郵件地址類型是簡易郵件傳輸通訊協定 (SMTP) ,且郵件儲存至個人資料夾檔案的存放區 (PST) 時,才可使用垃圾郵件篩選支援。

傳回值

S_OK

變更的承諾已成功。

MAPI_E_NO_ACCESS

如果已設定KEEP_OPEN_READONLY,SaveChanges 就無法讓物件保持開啟唯讀許可權;如果已設定KEEP_OPEN_READWRITE,則無法保留讀取/寫入許可權。 不會認可任何變更。

MAPI_E_OBJECT_CHANGED

對象在開啟后已變更。

MAPI_E_OBJECT_DELETED

對象在開啟後已刪除。

註解

IMAPIProp::SaveChanges 方法會讓支持處理之交易模型的物件永久變更屬性,例如訊息、附件、通訊簿容器和傳訊用戶物件。 不支援資料夾、訊息存放區和配置檔區段等交易的物件會立即永久變更。 不需要呼叫 SaveChanges

因為在儲存所有屬性之前,服務提供者不需要為其對象產生專案標識符,所以在呼叫其 SaveChanges 方法之後,物件的PR_ENTRYID (PidTagEntryId) 屬性可能無法使用。 有些提供者會等到 SaveChanges 呼叫上設定KEEP_OPEN_READONLY旗標。 KEEP_OPEN_READONLY表示要儲存在目前呼叫中的變更將會是物件上的最後一項變更。

在用戶端使用 SaveChanges 儲存訊息變更,並使用 IUnknown::Release 方法釋放訊息物件之前,某些訊息存放區實作不會在資料夾中顯示新建立的訊息。 此外,在呼叫 SaveChanges 之後,某些物件實作無法為新建立的對象產生PR_ENTRYID屬性,而有些則只有在使用 ulFlags 中設定的 KEEP_OPEN_READONLY 呼叫 SaveChanges 之後才能執行此動作。

實作者注意事項

如果您收到KEEP_OPEN_READONLY旗標,您可以選擇將物件的存取保留為讀取/寫入。 不過,傳遞KEEP_OPEN_READWRITE旗標時,提供者絕對不能讓物件保持只讀狀態。

當用戶端將多個附件儲存到多個訊息時,它會針對每個附件和每個訊息呼叫 SaveChanges 方法。 用戶端通常會為每個呼叫設定MAPI_DEFERRED_ERRORS,但最後一個呼叫除外。 您可以傳回上一次呼叫或先前呼叫的錯誤。 您甚至可以忽略 旗標。

如果KEEP_OPEN_READWRITE或KEEP_OPEN_READONLY與MAPI_DEFERRED_ERRORS一起設定,您可以忽略錯誤延遲要求。 如果未在 ulFlags中設定MAPI_DEFERRED_ERRORS,則可以針對 SaveChanges 呼叫傳回其中一個先前延遲的錯誤。

遠端傳輸提供者是否提供這個方法的功能性實作是選擇性的,而且取決於實作中的其他設計選項。 如果您實作這個方法,請根據這裡的檔來執行此動作。 因為資料夾對象和狀態物件不會交易,所以至少遠端傳輸提供者的 SaveChanges 實作必須傳回S_OK,而不實際執行任何工作。

呼叫者注意事項

如果客戶端通過KEEP_OPEN_READONLY,請呼叫 IMAPIProp::SetProps 方法,然後再次呼叫 SaveChanges ,相同的實作可能會失敗。

從您設定KEEP_OPEN_READWRITE的呼叫接收MAPI_E_NO_ACCESS之後,您將繼續擁有物件的讀取/寫入許可權。 您可以再次呼叫 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 之前,無法處理某些屬性,通常是計算屬性。

當您進行大量變更,例如將附件儲存至多個訊息時,請在 ulFlags中設定 MAPI_DEFERRED_ERRORS旗標,以延遲錯誤處理。 如果您將多個附件儲存至多個訊息,請對每個附件進行一個 SaveChanges 呼叫,並呼叫每個訊息一個 SaveChanges 。 為每個附件呼叫和除了最後一個訊息以外的所有訊息設定MAPI_DEFERRED_ERRORS旗標。

如果 SaveChanges 傳 回MAPI_E_OBJECT_CHANGED,請檢查原始物件是否已修改。 若是如此,請警告使用者,使用者可以要求變更覆寫先前的變更,或將物件儲存在其他地方。 如果已刪除原始物件,請警告使用者讓他們有機會將物件儲存在另一個位置。

您無法在已刪除的開啟物件上呼叫具有FORCE_SAVE旗標的 SaveChanges

如果 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 Canonical 屬性
IMAPIProp:IUnknown儲存 MAPI 屬性