无法访问ATL / COM C ++ Outlook Addin中的邮件项目

时间:2016-12-19 11:44:14

标签: c++ outlook com outlook-addin atl

我正在尝试获取邮件信息,并根据用户点击Outlook中的发送按钮时的值执行一些操作。因此我使用此功能:

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

在OnConnection事件处理程序中,我调用

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

它在Header-File中实现,如下所示:

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

我做错了什么?提前致谢

1 个答案:

答案 0 :(得分:1)

您的代码中有一些警告,可能会导致问题:

  • 您的ItemSend()方法与Outlook的类型库中的方法不同。它应该声明为ItemSend(IDispatch* Item, VARIANT_BOOL* Cancel)
  • 指向IDispEventSimpleImpl模板声明中事件调度接口的IID的指针指向Outlook::ItemEvents。但是,您有兴趣处理来自Outlook::ApplicationEvents
  • 的活动
  • 虽然并不重要,但是对DispEventAdvise()的调用会将应用程序接口指针强制转换为IDispatch*,而函数需要IUnknown*参数。您也可以省略第二个参数。

以下类演示了如何相应地处理ItemSend事件。由于您正在实现IDTExtensibility2接口,因此您需要将初始化和清理例程分别移动到其OnConnectionOnDisconnection方法。

_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;
};