2010-05-06 43 views
2

我正在爲C++中的Outlook 2007做一個加載項。Outlook加載項。如何管理項目事件

我需要從Outlook項目(聯繫人,約會,任務和註釋)中捕獲創建,更改或刪除事件,但我發現的唯一信息/示例是Visual Basic,因此我不知道連接事件處理程序。

下面是相關的一些信息:http://msdn.microsoft.com/en-us/library/bb208390(v=office.12).aspx

歡迎任何幫助:)謝謝

更新

對不起採取這一長期更新,我已經出城。我有一些懷疑/問題,你可能會知道如何提供幫助。

在我的情況下,我正在開始這個項目,所以我對這一切有點困惑。我有從IDTExtensibility2派生的類OutlookAddin。我還有另一個叫做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; 

我讀過您發佈的鏈接,但仍然有這些疑惑...

更新2

這是比較複雜的,而不是理解我,雖然在第一個實例。

所以我有這樣的:

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

然後在OutlookAddin.cpp,OnConnection方法:

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' 被定義一樣

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保留所有環境的地方。

此處的預期行爲是在創建/編輯/刪除ContactItem時觸發OutlookAddin類中的函數「OnItemChange」,但這種情況沒有發生......我將結構改爲一切,位於主類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標識您的接收器 這裏。然後是其餘的宏的設置和處理函數的實現的喜悅 - 我參考thisthis文章的例子和dispinterface ItemsEvents,你可以在oleview.exe查找。


關於更新1:
如果你想收到AutoSync的事件,實現接口有 - 你不需要的事件下沉到任何具體的實例。然而,你知道你的設計最好:)
我只是儘可能多地保留中心插件類的邏輯。

註冊碼將進入實現事件的類的某種方法,然後在它應該開始接收事件時被調用,而typedef可能是例如。很好地放在班級的聲明中。


關於更新2:

從看一眼看上去基本上是正確的,但OnItemChange()需要一個參數 - 一個IDispatch

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

謝謝你,我要帶看看這個;) – framara 2010-05-06 14:25:18

+0

問題更新了,如果你可以看看。謝謝。 – framara 2010-05-11 13:09:44

+0

@framara,已更新。 – 2010-05-11 13:45:40