COM实现取outlook地址簿

来源:互联网 发布:蛋糕西点软件 编辑:程序博客网 时间:2024/05/01 13:50

很简单,使用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;  
}