2016-07-17 2 views
0

Мне нужно синхронизировать контакты Outlook с другой службой. Я могу подписаться создавать, изменять и удалять события следующим образом:Как получить идентификатор Entry удаленного объекта OutlookItem?

 Outlook.MAPIFolder folderContacts = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts); 
     Outlook.Items contacts = folderContacts.Items; 

     contacts.ItemAdd += Contacts_ItemAdd; 
     contact.ItemChange += Contacts_ItemChange; 
     contacts.ItemRemove += Contacts_ItemRemove; 

Это отлично работает для создания и изменения, как я получить деталь в обработчик события:

private void Contacts_ItemAdd(object Item) 
    { 
     Outlook.ContactItem contact = (Outlook.ContactItem)Item; 
     ... 
    } 

Однако, в случае удалить событие, я не получаю информацию об удаленном элементе.

private void Contacts_ItemRemove() { 
     // how to get deleted item or at least it's EntryID? 
    } 

Как получить идентификатор Entry удаленного объекта? Я использую этот идентификатор, чтобы идентифицировать элемент в другой службе.

ответ

1

Все уведомления на основе MAPI возникают после того, как действие уже произошло. Когда вы получите событие ItemRemove, сообщение уже исчезло.

На расширенном уровне MAPI (C++ или Delphi только), когда элемент удаляется, провайдер магазина поднимает следующее уведомление fnevTableModified/TABLE_ROW_DELETED (вы можете увидеть его в OutlookSpy, если нажать кнопку IMAPIFolder и посмотрите на журнал на внизу вкладки GetContentsTable). Только PR_INSTANCE_KEY свойство доступно:

ulEventType: fnevTableModified 
    tab.ulTableEvent: TABLE_ROW_DELETED 
    tab.propIndex: (PR_INSTANCE_KEY, cb:4, lpb: 0F 3E D3 A4 
    tab.propPrior: (PR_NULL, null) 
    tab.row: (cValues : 0 
    ) 

Вы можете сделать только эту работу путем извлечения PR_INSTANCE_KEY для всех элементов в папке заранее, так что вы можете отобразить PR_ENTRYID < -> PR_INSTANCE_KEY.

Объектная модель Outlook не раскрывает PR_INSTANCE_K EY в событии ItemRemove. Если используется Redemption, это вариант RDOItems. ItemRemove событие передает ключ экземпляра в качестве параметра. PR_INSTANCE_KEY для всех элементов в папке можно получить i на один вызов, используя RDOItems.MAPITable. ExecSQL способ.

+0

Что о событии ContactItem.BeforeDelete (https://msdn.microsoft.com/en-us/l ibrary/офис/ff868306.aspx)? Могу ли я каким-то образом использовать это? – Sebi

+0

BeforeDelete - это чистый пользовательский интерфейс, созданный Outlook. В старых версиях Outlook он действительно не работал, и он был поднят только на машине, где работает код. Если, например, вы удаляете элемент с помощью OWA, событие не будет срабатывать в Outlook. –

1

Вам необходимо сохранить список элементов в каждой папке. А в обработчике событий ItemRemove вы можете сравнить список существующих элементов с вашими. Я рекомендую прочитать следующую серию статей, которая дает пример для случая NewMailEx в Outlook (иногда это не обстреливали все, поэтому разработчики должны ищет возможные обходные подобное):