很简单,使用Outlook的com接口。数据类型转换比较讨厌,一不小心就crash了。所以如果可以,还是用dot net来做吧,微软有很好的封装。
#include "stdafx.h"
#include "OutlookAddin.h"
#include "Addin.h"
#include <iostream>
#include <fstream>
/
// CAddin
_ATL_FUNC_INFO OnClickButtonInfo ={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}};
STDMETHODIMP CAddin::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IAddin
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CAddin::OnConnection(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)
{
CComQIPtr <Outlook::_Application> spApp(Application);
ATLASSERT(spApp);
if (init(spApp))
{
bConnected = true;
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CAddin::OnDisconnection(ext_DisconnectMode RemoveMode, SAFEARRAY * * custom)
{
if(bConnected)
{
HRESULT hr = CommandButton1Events::DispEventUnadvise((IDispatch*)m_spButton);
if(FAILED(hr))
return hr;
bConnected = false;
}
return S_OK;
}
void __stdcall CAddin::OnClickButton(IDispatch* /*Office::_CommandBarButton* */ Ctrl,VARIANT_BOOL * CancelDefault)
{
USES_CONVERSION;
CComQIPtr<Office::_CommandBarButton> pCommandBarButton(Ctrl);
if (ExportContactList())
{
MessageBox(NULL, "Export success!", "OnClickButton", MB_OK);
}
else
{
MessageBox(NULL, "Export fail!", "OnClickButton", MB_OK);
}
}
BOOL CAddin::init(const CComQIPtr <Outlook::_Application> &spApp)
{
m_spApp = spApp;
CComPtr<Outlook::_Explorer> spExplorer;
spApp->ActiveExplorer(&spExplorer);
CComPtr < Office::_CommandBars> spCmdBars;
HRESULT hr = spExplorer->get_CommandBars(&spCmdBars);
if(FAILED(hr))
return hr;
ATLASSERT(spCmdBars);
CComPtr < Office::CommandBar> spCmdBar = NULL;
CComVariant vName("Export Contact List");
CComPtr <Office::CommandBar> spNewCmdBar = NULL;
CComVariant vPos(1);
CComVariant vTemp(VARIANT_TRUE);
CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
spNewCmdBar = spCmdBars->Add(vName, vPos, vEmpty, vTemp);
CComPtr < Office::CommandBarControls> spBarControls = NULL;
spBarControls = spNewCmdBar->GetControls();
ATLASSERT(spBarControls);
CComVariant vToolBarType(1);
CComVariant vShow(VARIANT_TRUE);
CComPtr < Office::CommandBarControl> spNewBar = NULL;
spNewBar = spBarControls->Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow);
ATLASSERT(spNewBar);
CComQIPtr < Office::_CommandBarButton> spCmdButton(spNewBar);
ATLASSERT(spCmdButton);
HBITMAP hBmp =(HBITMAP)::LoadImage(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
// put bitmap into Clipboard
::OpenClipboard(NULL);
::EmptyClipboard();
::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);
::CloseClipboard();
::DeleteObject(hBmp);
// set style before setting bitmap
spCmdButton->PutStyle(Office::msoButtonIconAndCaption);
hr = spCmdButton->PasteFace();
if (FAILED(hr))
return hr;
spCmdButton->PutVisible(VARIANT_TRUE);
spCmdButton->PutCaption(OLESTR("Export Contact"));
spCmdButton->PutEnabled(VARIANT_TRUE);
spCmdButton->PutTooltipText(OLESTR("The contact list will be exprot to contact.txt"));
//show the toolband
spNewCmdBar->PutVisible(VARIANT_TRUE);
m_spButton = spCmdButton;
hr = CommandButton1Events::DispEventAdvise((IDispatch*)m_spButton);
if(FAILED(hr))
return hr;
return TRUE;
}
void Append(BSTR str, std::string &result)
{
if(str != NULL)
{
_bstr_t bstr_t(str);
result.append(bstr_t);
}
result.append(";");
}
BOOL CAddin::ExportContactList()
{
HRESULT hr;
CComBSTR bsMapi(L"MAPI");
CComPtr < Outlook::_NameSpace> spNameSpace = NULL;
hr = m_spApp->GetNamespace(bsMapi, &spNameSpace);
if(FAILED(hr))
return hr;
CComPtr <Outlook::MAPIFolder> spOutlookContactFolder = NULL;
hr = spNameSpace->GetDefaultFolder(Outlook::olFolderContacts, &spOutlookContactFolder);//Get Contact folder
if(FAILED(hr))
return hr;
CComPtr <Outlook::_Items> spItems = NULL;
spOutlookContactFolder->get_Items(&spItems);
BSTR tmp;
std::string record;
CComPtr< IDispatch > spFirstItem = NULL;
spItems->GetFirst(&spFirstItem);
CComQIPtr< Outlook::_ContactItem> spContactItem(spFirstItem);
while(true)
{
spContactItem->get_FileAs(&tmp);
Append(tmp, record);
spContactItem->get_Title(&tmp);
Append(tmp, record);
spContactItem->get_CompanyName(&tmp);
Append(tmp, record);
spContactItem->get_PagerNumber(&tmp);
Append(tmp, record);
spContactItem->get_MobileTelephoneNumber(&tmp);
Append(tmp, record);
spContactItem->get_BusinessTelephoneNumber(&tmp);
Append(tmp, record);
spContactItem->get_HomeTelephoneNumber(&tmp);
Append(tmp, record);
spContactItem->get_BusinessFaxNumber(&tmp);
Append(tmp, record);
spContactItem->get_Email1Address(&tmp);
Append(tmp, record);
spContactItem->get_HomeAddress(&tmp);
Append(tmp, record);
spContactItem->get_BusinessAddress(&tmp);
Append(tmp, record);
spContactItem->get_OtherAddress(&tmp);
Append(tmp, record);
record.append("/n");
CComPtr< IDispatch > spItem;
spItems->GetNext(&spItem);
if(spItem == NULL)
{
break;
}
else
{
spContactItem = spItem;
}
}
std::fstream out("c://contact.txt",std::fstream::out);
out << record.c_str();
out.close();
return TRUE;
}