我想监视Outlook加载项中的新联系人和已更改的联系人

时间:2011-11-04 07:41:33

标签: c++ com outlook-addin

我在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()!有什么想法吗?

1 个答案:

答案 0 :(得分:0)

解决了它。希望这对某人有用。事实证明,只要我的pContactItems指针超出范围(在使用它之后),就不会注册任何事件。我将pContactItems移动到一个全局变量,它开始工作。