如何创建 Outlook 插件/加载项






1.70/5 (10投票s)
我在网上搜索时发现,关于使用 VC 创建 Outlook 加载项的信息太少了。当时我只能找到 VB 应用程序的教程。因此,我创建了这个应用程序,并附上了我找到的有用的网站链接。现在,您可以使用 VC 轻松创建插件。
引言
在我进行 Outlook 加载项项目时,我在 VC++ 中搜索了很多关于 Outlook 加载项创建的内容,但只在互联网上找到了很少的文档。因此,当我成功捕获发送邮件和新邮件事件时,我计划更新这些信息来帮助他人。
我相信这将为您提供关于如何创建加载项的思路。
Outlook 加载项是使用 ATL 创建的。此代码可帮助您捕获发送邮件和收到新邮件时的事件。
使用代码
创建 Outlook 加载项的步骤。
1. 在 vc++6.0 中创建一个新项目。选择“ATL COM AppWizard”作为项目类型,并在 ATL COM AppWizard 第 1 步中选择“Dynamic Link Library”。点击该窗口上的“Finish”按钮。ATL 项目 DLL 就创建好了。
2. 在项目中,点击“Insert”菜单,选择“New ATL Object”。在“Category”中选择“Object”,在“Objects”中选择“Simple Object”,然后点击“Next”按钮。在“Names”选项卡的“Short Name”中输入您的加载项名称。在“Attributes”选项卡中选择“Support ISupportedErrorInfo”。您的加载项接口就创建好了。
3. 进入项目的类视图,右键单击您的接口类名(例如,如果您将接口命名为“AddIN”,则在类视图中会找到“CAddIN”,选择此类并右键单击),在弹出的菜单中点击“implement Interface”。如果您收到任何警告,只需点击“OK”按钮,您将看到一个名为“Browse Type Libraries”的窗口。在此列表中找到并选择“Microsoft Add-in Designer(1.0)”,然后点击“OK”。之后,您将看到一个名为“implement Interface”的窗口,在此处我们需要选择“_IDTExtensiblity2”并点击“OK”。
向导将实现此接口的默认方法,您可以在类视图中看到它们。“_IDTExtensiblity2”接口是创建 Office 加载项所必需的。
4. Go to AddIN header file and add following lines. extern _ATL_FUNC_INFO OnSendInfo; extern _ATL_FUNC_INFO OnNewMailInfo; public IDispEventSimpleImpl<1,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)>, public IDispEventSimpleImpl<2,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)> public: typedef IDispEventSimpleImpl</*nID =*/ 1,CADDIN_Chaitanya, &__uuidof(Outlook::ApplicationEvents)> AppEvents; typedef IDispEventSimpleImpl</*nID =*/ 2,CADDIN_Chaitanya, &__uuidof(Outlook::ApplicationEvents)> AppEvents_New; BEGIN_SINK_MAP(CADDIN_Chaitanya) SINK_ENTRY_INFO(1,__uuidof(Outlook::ApplicationEvents),/*dispinterface*/0x0000F002,OnSend,&OnSendInfo) SINK_ENTRY_INFO(2,__uuidof(Outlook::ApplicationEvents),/*dispinterface*/0x0000F003,OnNewMail,&OnNewMailInfo) END_SINK_MAP() // event handler functions void __stdcall OnNewMail(); void __stdcall OnSend(); // At the add of the class add defination this line (Last line of the class defination) private: CComPtr<Outlook::_Application> m_spApp;//application CComPtr<Outlook::_Application> m_spApp_Event_Send_Mail;//application CComPtr<Outlook::_Application> m_spApp_Event_New_Mail;//application // Add this line in side OnConnetion CComQIPtr <Outlook::_Application> spApp(Application); ATLASSERT(spApp); m_spApp_Event_New_Mail = m_spApp_Event_Send_Mail = m_spApp = spApp; //store the application object //////////////////////// Application event //////////////////////////////////// HRESULT hr = NULL;//DispEventAdvise((IDispatch*)spExplorer); hr = AppEvents::DispEventAdvise((IDispatch*)m_spApp_Event_Send_Mail,&__uuidof(Outlook::ApplicationEvents)); if(FAILED(hr)) return hr; hr = AppEvents_New::DispEventAdvise((IDispatch*)m_spApp_Event_New_Mail ,&__uuidof(Outlook::ApplicationEvents)); if(FAILED(hr)) return hr; // Add this line inside OnDisconnection Methods hr = AppEvents::DispEventUnadvise((IDispatch*)m_spApp_Event_Send_Mail); hr = AppEvents_New::DispEventUnadvise((IDispatch*)m_spApp_Event_New_Mail); 5. Go to File view and select AddIN cpp file and your need to add following lines. _ATL_FUNC_INFO OnSendInfo ={CC_STDCALL,VT_EMPTY,1,VT_DISPATCH}; _ATL_FUNC_INFO OnNewMailInfo ={CC_STDCALL,VT_EMPTY,0}; void __stdcall CADDIN_Chaitanya::OnNewMail() { //AfxMessageBox("heloo"); ::MessageBox(0,"Chaitanya New Mail","On New Mail",0); } void __stdcall CADDIN_Chaitanya::OnSend() //(IDispatch * /*Office::_CommandBarButton**/ Ctrl,bool) { ::MessageBox(0,"Chaitanya Send ","On Send Clicked",0); }
关注点
我在网上搜索时没有找到一个带有 VC++ 语法解释的应用程序。因此,我在这里简要说明一下。IDispEventSimpleImpl 是一个接口类,需要正确传递参数。首先,您需要了解哪些事件属于哪个类,例如,有些事件属于 ApplicationEvent,有些属于 ExplorerEvent,有些属于 ItemEvent,还有些属于 ItemEvents。
这里我捕获了两个事件,它们都属于 Application Events。
因此,我传递给 IDispEventSimpleImpl 的第三个参数是:
public IDispEventSimpleImpl<1,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)>,
public IDispEventSimpleImpl<2,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)>
发送邮件最重要的部分是“0x0000F002”这类数字,它们是 dispinterface,我们需要在 Begin_Sink_Map 中指定,例如:
SINK_ENTRY_INFO(1,__uuidof (Outlook::ApplicationEvents),/*dispinterface*/0x0000F002,OnSend,&OnSendInfo)
SINK_ENTRY_INFO(2,__uuidof(Outlook::ApplicationEvents),/*dispinterface*/0x0000F003,OnNewMail,&OnNewMailInfo)
如果指定了错误的数字,可能会出现问题,您可能无法收到事件。这些数字可以很容易地从 VB 代码中找到。第三个最重要的部分是“Advise”和“UnAdvise”,在 VC 中对应的语法分别是“DispEventAdvise”和“DispEventUnadvise”。如果我们不在代码中进行“Advise”,那么当 Outlook 生成事件时,我们就无法收到事件。这三个是最重要的因素,在创建加载项时需要正确理解,否则会在接收 Outlook 事件时遇到问题。
如果您有任何问题,可以在这里留言。我会尽力给您满意的答复。
其他链接
MSDN 和 CodeProject 的链接,可以帮助您理解和开发。
http://support.microsoft.com/kb/196776/
http://support.microsoft.com/kb/199870/
http://support.microsoft.com/kb/220600
http://support.microsoft.com/kb/230689/EN-US/
http://msdn2.microsoft.com/en-us/library/aa662931(office.11).aspx
http://msdn2.microsoft.com/en-us/library/aa201312(office.11).aspx
http://msdn2.microsoft.com/en-us/library/aa189757(office.10).aspx
http://msdn2.microsoft.com/en-us/library/aa155732(office.10).aspx
http://msdn2.microsoft.com/en-us/library/ms268749(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/aa141349(office.10).aspx
http://msdn2.microsoft.com/en-us/library/aa189757(office.10).aspx
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
com Add - in
http://msdn2.microsoft.com/en-us/library/aa155767(office.10).aspx
http://msdn2.microsoft.com/en-us/library/aa140126(office.10).aspx
http://msdn2.microsoft.com/en-us/library/aa167881(office.11).aspx http://support.microsoft.com/kb/q241287/ http://support.microsoft.com/kb/q199870/
/////////////////////// Sink Event
http://msdn2.microsoft.com/en-us/library/yscwkhd6(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/kdbd8xsk(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/aa155701(office.10).aspx
http://msdn2.microsoft.com/en-us/library/aa155701(office.10).aspx#odc_ch11olevents_topic2
http://www.codeguru.com/forum/printthread.php?t=269119