2010-05-06 5 views
2

Я делаю надстройку для Outlook 2007 на C++.Надстройка Outlook. Как управлять элементами События

Мне нужно зафиксировать события, такие как создание, изменение или удаление из элементов Outlook (контакт, назначение, задачи и заметки), но единственная информация/примеры, которые я нашел, для Visual Basic, поэтому я не знаю, как для подключения обработчика событий.

Вот некоторая информация, касающаяся: http://msdn.microsoft.com/en-us/library/bb208390(v=office.12).aspx

Любая помощь приветствуется :) Спасибо

Update

Извините за то, так долго, чтобы обновить, я был вне города. У меня есть некоторые сомнения/проблемы, которые вы можете знать, как помочь.

В моем случае я беру этот проект, который был запущен, поэтому я немного смущен обо всем этом. У меня есть класс OutlookAddin, который происходит из IDTExtensibility2. У меня также есть этот другой класс, называемый AutoSync, если бы я хотел бы использовать все методы, когда срабатывает событие. Объект этого класса инициализируется в OutlookAddin.cpp OnStartupComplete.

Согласно вашему сообщению MyClass должен распространяться от IDispEventSimpleImpl<1 /*N*/, MyClass, &__uuidof(Outlook::ItemsEvents)>, но какой из них? OutlookAddin или AutoSync?

Куда я должен положить этот код также?

CComPtr<Outlook::MAPIFolder> folder; 
// get the folder you're interested in 
CComPtr<Outlook::_Items> items; 
hr = folder->get_Items(&items); 
hr = MyItemEvents::DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

typedef IDispEventSimpleImpl<1 /*N*/, MyClass, 
      &__uuidof(Outlook::ItemsEvents)> MyItemEvents; 

Я прочитал ссылки, которые вы размещены, но все еще иметь эти сомнения ...

Update 2

Это сложнее понять, чем я, хотя в первую очередь.

Так что я, как это:

OutlookAddin.h

class OutlookAddin : 
public IDTExtensibility2, 
public IDispEventSimpleImpl<1, OutlookAddin, &__uuidof(Outlook::ItemEvents)> 
... 
BEGIN_SINK_MAP(OutlookAddin) 
SINK_ENTRY_INFO(1, __uuidof(Outlook::ItemEvents), 0xf002, OutlookAddin::OnItemChange, &OnSimpleEventInfo) 
END_SINK_MAP() 
... 
void __stdcall OnItemChange(); 

'OnSimpleEventInfo' определяется как:

extern _ATL_FUNC_INFO OnSimpleEventInfo; 
_ATL_FUNC_INFO OnSimpleEventInfo = {CC_STDCALL,VT_EMPTY,0}; 

затем в OutlookAddin.cpp, OnConnection метод:

CComPtr<Outlook::MAPIFolder> folder; 
CComPtr<Outlook::_Items> items; 

OutlookWorker::GetInstance()->GetNameSpacePtr()->GetDefaultFolder(olFolderContacts, &folder); 
folder->get_Items(&items); 
DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

b eing 'OutlookWorker :: GetInstance() -> GetNameSpacePtr()' _NameSpacePtr, где сохраняется вся среда.

Ожидаемое поведение здесь заключается в том, чтобы запустить функцию OnItemChange из класса OutlookAddin при создании/редактировании/удалении ContactItem, но этого не происходит ... Я немного изменил структуру, чтобы все было в основном классе OutlookAddin , Затем по функции «OnItemChange» я запустил объект «AutoSync», о котором я вам говорил раньше.

В любом случае, я слежу за статьями, которые вы мне дали, очень полезно, спасибо. У вас еще есть какое-то другое предложение для меня?

Благодарю ваше терпение.

ответ

1

Ее было какое-то время, но вы должны получить эти запись события, советы для Folder.Items:

CComPtr<Outlook::MAPIFolder> folder; 
// get the folder you're interested in 
CComPtr<Outlook::_Items> items; 
hr = folder->get_Items(&items); 
hr = MyItemEvents::DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

Где ваш класс MyClass происходит от:

IDispEventSimpleImpl<1 /*N*/, MyClass, &__uuidof(Outlook::ItemsEvents)> 

И MyItemEvents является:

typedef IDispEventSimpleImpl<1 /*N*/, MyClass, 
      &__uuidof(Outlook::ItemsEvents)> MyItemEvents; 

N идентифицирует вашу раковину Вот. Тогда есть радость оставшихся макросов для настройки, а функции обработчика для реализации - я ссылаюсь на статьи this и this, а также на номер dispinterface ItemsEvents, который вы можете найти в oleview.exe.


Что касается обновления 1:
Если вы хотите получать события в AutoSync, реализуют интерфейс там - вы не обязаны тонуть события какого-либо конкретного экземпляра. Тем не менее, вы знаете, что ваш дизайн лучше всего :)
Я бы просто лично держал столько логики из класса addin, насколько это возможно.

Код регистрации будет использоваться в каком-либо методе класса, реализующего события, который затем и вызывается, когда он должен начинать принимать события, тогда как typedef будет, например, хорошо помещен в декларацию класса.


Что касается обновления 2:

Из беглого взгляда это выглядит в основном правильно, но OnItemChange() принимает один параметр - IDispatch:

_ATL_FUNC_INFO AtlCallDispatch = {CC_STDCALL, VT_EMPTY, 1, {VT_DISPATCH}}; 
+0

Спасибо, я собираюсь взять посмотрите на это;) – framara

+0

Вопрос обновлен, если бы вы могли посмотреть. Благодарю. – framara

+0

@framara, обновлено. –

Смежные вопросы