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

标签 c++ outlook com outlook-addin atl

我正在尝试获取邮件信息并根据用户在 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);

我做错了什么?提前致谢

最佳答案

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

  • 你的 ItemSend()方法不同于 Outlook 类型库中的方法。它应该声明为 ItemSend(IDispatch* Item, VARIANT_BOOL* Cancel) .
  • 在你的 IDispEventSimpleImpl 中指向事件调度接口(interface) IID 的指针模板声明指向 Outlook::ItemEvents .但是,您有兴趣处理来自 Outlook::ApplicationEvents 的事件.
  • 虽然不重要,但您调用 DispEventAdvise()将应用程序接口(interface)指针转换为 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;
};

关于c++ - 无法访问 ATL/COM C++ Outlook 插件中的邮件项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41221863/

相关文章:

c++ - 使用随机纹理 ID 可以吗?

c# - RibbonDropDown 丢失项目

python - 使用 Python 发送 Outlook 电子邮件的方法差异

com - 在它自己的 exe 容器中创建每个 COM 实例

c# - 对于从 IEnumerable<T> 继承的 .Net 类,为什么 GetEnumerator 在 COM 中不可见?

c++ - 管道中是否有任何提案允许模板中的任何参数?

c++ - 如何访问 std::string 的每个成员?

c++ - _ATL_APARTMENT_THREADED 和 _ATL_FREE_THREADED 冲突

c++ - Boost Variant 本质上是 C/C++ 中的 union ?

excel - 从 Excel VBA 将签名插入 Outlook 电子邮件