Я хочу отслеживать новые и измененные контакты в надстройке Outlook - PullRequest
0 голосов
/ 04 ноября 2011

Я создал надстройку Outlook в C ++ (VS6!), Которая отслеживает коллекцию InspectorsCollection, чтобы отследить, когда пользователь открывает или закрывает элемент контакта.Отлично работает.

Теперь я хочу, чтобы он отслеживал, когда пользователь сохраняет новый контакт или изменяет существующий.Я решил изменить класс CInspectorsCollectionEventHandler для работы с элементами контактов.Кажется, все в порядке, и FindConnectionPoint () и Advise () успешно, но мой Invoke () никогда не вызывается.

Вот как я настраиваюсь, когда моя библиотека запускается:

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();
    }
}

Похоже, все выполняется нормально,и код основан на коде, который работает (для инспекторов), но я просто не получаю никаких звонков на мой Invoke ()!Есть идеи?

1 Ответ

0 голосов
/ 05 ноября 2011

Решил это. Надеюсь, это кому-нибудь пригодится. Оказывается, как только мой указатель pContactItems вышел из области видимости (сразу после его использования), никакие события не были зарегистрированы. Я переместил pContactItems в глобальную переменную, и она начала работать.

...