簡體   English   中英

無法訪問ATL / COM C ++ Outlook Addin中的郵件項目

[英]Can't access mail item in ATL/COM C++ Outlook Addin

當用戶在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);

我究竟做錯了什么? 提前致謝

您的代碼中有幾點警告,可能會導致問題:

  • 您的ItemSend()方法不同於Outlook類型庫中的方法。 應該將其聲明為ItemSend(IDispatch* Item, VARIANT_BOOL* Cancel)
  • IDispEventSimpleImpl模板聲明中指向事件Dispinterface的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;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM