Не удается получить доступ к элементу почты в ATL / COM C ++ Outlook Addin

Я пытаюсь получить информацию о почте и выполнить некоторые действия, основанные на значениях, когда пользователь нажимает кнопку отправки в Outlook. Поэтому я использую эту функцию:

VOID WINAPI CConnect::ItemSend(IDispatch * Item, bool Cancel)

В обработчике события OnConnection я вызываю

DispEventAdvise((IDispatch*)m_Application, &__uuidof(Outlook::ApplicationEvents));

Он реализован в файле заголовка следующим образом:

public IDispEventSimpleImpl<1, CConnect, &__uuidof(Outlook::ItemEvents)>

public:

VOID WINAPI ItemSend(IDispatch * Item, bool Cancel);

BEGIN_SINK_MAP(CConnect)
SINK_ENTRY_INFO(1, __uuidof(Outlook::ItemEvents), 0x0000F002, ItemSend, &fiMailItemEvents)
END_SINK_MAP()

Это работает так же, как и должно, но внутри функции, которую я пытаюсь получить, у меня всегда есть исключение. Это мой код для доступа к элементу:

CComPtr<Outlook::_MailItem> mail;
Item->QueryInterface(IID__MailItem, (void**)&mail);

Что я делаю неправильно? заранее спасибо

0

Решение

В вашем коде есть несколько предостережений, которые могут привести к проблемам:

  • Ваш ItemSend() метод отличается от метода в библиотеке типов Outlook. Должен быть объявлен как ItemSend(IDispatch* Item, VARIANT_BOOL* Cancel),
  • Указатель на IID дисперинтерфейса события в вашем IDispEventSimpleImpl объявление шаблона указывает на Outlook::ItemEvents, Тем не менее, вы заинтересованы в обработке событий от Outlook::ApplicationEvents,
  • Хотя это и не важно, ваш призыв к DispEventAdvise() приводит указатель интерфейса приложения к IDispatch*в то время как функция ожидает IUnknown* параметр. Вы также можете опустить второй параметр.

Следующий класс демонстрирует, как обрабатывать ItemSend событие соответственно. Поскольку вы реализуете IDTExtensibility2 интерфейс, вам нужно переместить процедуры инициализации и очистки на его OnConnection а также OnDisconnection методы соответственно.

_ATL_FUNC_INFO fiMailItemEvents = { CC_STDCALL, VT_EMPTY, 2, { VT_DISPATCH, VT_BOOL | VT_BYREF } };

class CConect :
public ATL::IDispEventSimpleImpl<1, CConect, &(__uuidof(Outlook::ApplicationEvents))>
{
public:
CConect(Outlook::_ApplicationPtr piApp)
{
m_piApp = piApp;
DispEventAdvise((IUnknown*)m_piApp);
}

virtual ~CConect()
{
DispEventUnadvise((IUnknown*)m_piApp);
}

void __stdcall OnItemSend(IDispatch* Item, VARIANT_BOOL* Cancel)
{
CComPtr<Outlook::_MailItem> mail;
HRESULT hr = Item->QueryInterface(__uuidof(Outlook::_MailItem), (void**)&mail);
}

BEGIN_SINK_MAP(CConect)
SINK_ENTRY_INFO(1, __uuidof(Outlook::ApplicationEvents), 0x0000F002, OnItemSend, &fiMailItemEvents)
END_SINK_MAP()

private:

Outlook::_ApplicationPtr m_piApp;
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]