【发布时间】:2017-05-04 11:05:09
【问题描述】:
当用户点击 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);
我做错了什么?提前致谢
【问题讨论】:
-
HRESULT的返回值是什么QueryInterface()? -
不幸的是它没有返回任何东西,因为应用程序总是崩溃并出现错误'0xC000041D:在用户回调期间遇到未处理的异常'
-
QueryInterface()返回一个 HRESULT,但是您没有检查它的值。只需像这样编辑您的代码:HRESULT hr = Item->QueryInterface(IID__MailItem, (void**)&mail);。然后在下一行下一个断点,查看hr的值。 -
它应该返回一个结果,但此时 Outlook 崩溃了,因此不会设置 HRESULT 值,也无法检索它。可能是物品有问题,但我不知道是什么原因造成的......
-
您的事件处理程序可能有问题。你在课堂上实施
IDispEventImpl或IDispEventSimpleImpl吗?
标签: c++ outlook com outlook-addin atl