Introduction
When I was working on outlook addin project I had searched lot on outlook addin creation in vc++ but I have found very few documents on the internet that's why when I got success in catching send and new mail event. I planned for updating thing for helping others.
I belive this will give you idea on how to create Add-ins.
Outlook Addin is created using ATL. This code helps you to capture events when Send Mail and New Mail received.
Using the code
Steps for creatding AddIN of outlook.
1. Create new project in vc++6.0. Select "ATL COM AppWizard" as project type and select "Dynamic Link Library" in ATL COM AppWizard Step 1 of 1. Click finish button on that window. ATL project dll is created.
2. In project click on Insert tab and select "New ATL Object". Select "Object" in category and "Simple Object" in objects then click "Next" button. In "Short Name" under Names tab write your add in name. Other tab Attributes select "Support ISupportedErrorInfo". Your AddIn interface is created.
3. Go to class view of your project and right click on your interface class name (Example if you have given interface name "AddIN" then in class view you will find "CAddIN" select this class and right click on that) inside popup click on implement Interface. If you are getting any Warning then just click "OK" button and you will get window with name "Browse Type Libraries". Browse "Microsoft Add-in Designer(1.0) " in that list and select it and click "OK" then you will get window with name "implement Interface" here we have to select "_IDTExtensiblity2" and click "OK".
Wizard will implement default methods of this interface that you can see inside class view. "_IDTExtensiblity2" interface needs to be implemented if we want to create addin of 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">Outlook::ApplicationEvents)>,
public IDispEventSimpleImpl<2,CADDIN_Chaitanya,&__uuidof("outlook::ApplicationEvents">Outlook::ApplicationEvents)>
public:
typedef IDispEventSimpleImpl< 1,CADDIN_Chaitanya, &__uuidof("outlook::ApplicationEvents">Outlook::ApplicationEvents)> AppEvents;
typedef IDispEventSimpleImpl< 2,CADDIN_Chaitanya, &__uuidof("outlook::ApplicationEvents">Outlook::ApplicationEvents)> AppEvents_New;
BEGIN_SINK_MAP(CADDIN_Chaitanya)
SINK_ENTRY_INFO(1,__uuidof("outlook::ApplicationEvents),/*dispinterface*/0x0000F002,OnSend,&OnSendInfo">Outlook::ApplicationEvents),0x0000F002,OnSend,&OnSendInfo)
SINK_ENTRY_INFO(2,__uuidof("outlook::ApplicationEvents),/*dispinterface*/0x0000F003,OnNewMail,&OnNewMailInfo">Outlook::ApplicationEvents),0x0000F003,OnNewMail,&OnNewMailInfo)
END_SINK_MAP()
void __stdcall OnNewMail();
void __stdcall OnSend();
private:
CComPtr<"outlook::_Application">Outlook::_Application> m_spApp;
CComPtr<"outlook::_Application">Outlook::_Application> m_spApp_Event_Send_Mail;
CComPtr<"outlook::_Application">Outlook::_Application> m_spApp_Event_New_Mail;
CComQIPtr <"outlook::_Application">Outlook::_Application> spApp(Application);
ATLASSERT(spApp);
m_spApp_Event_New_Mail = m_spApp_Event_Send_Mail = m_spApp = spApp;
HRESULT hr = NULL;
hr = AppEvents::DispEventAdvise((IDispatch*)m_spApp_Event_Send_Mail,&__uuidof("outlook::ApplicationEvents">Outlook::ApplicationEvents));
if(FAILED(hr))
return hr;
hr = AppEvents_New::DispEventAdvise((IDispatch*)m_spApp_Event_New_Mail ,&__uuidof("outlook::ApplicationEvents">Outlook::ApplicationEvents));
if(FAILED(hr))
return hr;
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()
{
::MessageBox(0,"Chaitanya New Mail","On New Mail",0);
}
void __stdcall CADDIN_Chaitanya::OnSend()
{
::MessageBox(0,"Chaitanya Send ","On Send Clicked",0);
}
Points of Interest
When I was going through the net I have not found single application with vc++ syntax explanation. That's why I am giving brief here.IDispEventSimpleImpl this is interface class that needs to be passes parameter properly.First of all you need to understand which event is under which class example some event are of ApplicationEvent some of are ExplorerEvent some are from ItemEvent and some from ItemEvents.
Here two event I have captured that both are of Application Events.
That's why my 3rd passing parameter to IDispEventSimpleImpl is that.
public IDispEventSimpleImpl<1,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)>,
public IDispEventSimpleImpl<2,CADDIN_Chaitanya,&__uuidof(Outlook::ApplicationEvents)>
Send Most Important thing is "0x0000F002" this kind of numbers this are dispinterface which we need to specifying inside Begin_Sink_Map for example::
SINK_ENTRY_INFO(1,__uuidof (Outlook::ApplicationEvents),/*dispinterface*/0x0000F002,OnSend,&OnSendInfo)
SINK_ENTRY_INFO(2,__uuidof(Outlook::ApplicationEvents),/*dispinterface*/0x0000F003,OnNewMail,&OnNewMailInfo)
If you will specified some wrong number then problem may happen you may not able to get event. This no you can easily get from net as vb codes.Third Most Important thing is "Advise" and "UnAdvise" in VC syntax is "DispEventAdvise" and "DispEventUnadvise" respectively. If we will not Advise in our code then we can not get event when outlook is generating that event.This 3 are most important factors which need to be understand properly when creating addin otherwise it will create problem for you in getting event of outlook.
If you have any problem then you can make not here. I will try best to give you convicing reply.
Other Links
Links of Msdn and codeproject which can help you for your understanding and development.
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