我在C ++(VS6!)中创建了一个Outlook插件,用于监视InspectorsCollection,以便在用户打开或关闭联系人项目时捕获。效果很好。
现在我希望它能够跟踪用户何时保存新联系人或修改现有联系人。我想我会修改CInspectorsCollectionEventHandler类来处理联系人项目。一切似乎都没问题,FindConnectionPoint()和Advise()成功了,但我的Invoke()永远不会被调用。
这是我设置的方式,当我的dll启动时:
Outlook::MAPIFolderPtr pFolder = g_pNameSpace->GetDefaultFolder(Outlook::olFolderContacts);
if (pFolder != NULL) {
Outlook::_ItemsPtr pContactItems = pFolder->GetItems();
if (pContactItems != NULL)
m_pContactItemsEventHandler = new CItemsEventHandler(pContactItems);
}
我的CItemsEventHandler构造函数调用SinkEvents()(下面),它正确执行。
以下是我的CItemsEventHandler类的关键部分:
STDMETHODIMP CItemsEventHandler::QueryInterface(REFIID riid, void** ppv)
{
if (NULL == ppv) return E_POINTER;
*ppv = NULL;
HRESULT hr = S_OK;
if ((__uuidof(Outlook::ItemsEvents) == riid) ||
(IID_IUnknown == riid) || (IID_IDispatch == riid))
*ppv = static_cast<IDispatch*>(this);
else
hr = E_NOINTERFACE;
if (NULL != *ppv)
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return hr;
}
void CItemsEventHandler::SinkEvents(LPDISPATCH pItems)
{
HRESULT hr;
// Get server's IConnectionPointContainer interface.
IConnectionPointContainer* pCPC;
hr = pItems->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPC);
if (SUCCEEDED(hr)) {
// Find connection point for events we're interested in.
hr = pCPC->FindConnectionPoint(__uuidof(Outlook::ItemsEvents), &m_pConnection);
if (SUCCEEDED(hr))
{
AddRef();
hr = m_pConnection->Advise(static_cast<IDispatch*>(this), &m_dwCookie);
}
// Release the IConnectionPointContainer
pCPC->Release();
}
}
看起来一切正常,代码基于可用的代码(对于Inspectors),但我只是没有调用我的Invoke()!有什么想法吗?
答案 0 :(得分:0)
解决了它。希望这对某人有用。事实证明,只要我的pContactItems指针超出范围(在使用它之后),就不会注册任何事件。我将pContactItems移动到一个全局变量,它开始工作。