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;
}
- COM实现取outlook地址簿
- COM实现读取outlook附件代码片段
- Outlook.com上线啦
- 获取outlook , Outlook Express 的地址本,
- 如何获得outlook Express地址簿的文件夹名
- 使用com object 控制outlook
- [COM]用AutoHotkey操控Outlook
- Office2000(2003) 下 outlook,word 的 com addin 之 delphi实现!(整理摸索)
- 【outlook plugin】Office2000下内部COM插件的编程实现 译者:徐景周
- 从outlook导入email地址
- Microsoft Outlook 2010客户端连接outlook.com邮箱收发邮件
- outlook 设置 YAHOO.COM.CN信箱
- Yahoo.com.cn邮箱的OutLook设置
- Java com bridge 操作Word Excel Outlook.
- Outlook.com的imap和pop服务器
- Outlook.com的android手机配置
- 将Outlook.com添加到Android设备
- 函数参数取地址实现参数自增
- Oracle 查询基础 (转)
- 配置Asp.net Ajax Control Toolkit
- PHP程序加速探索之压缩输出gzip
- DataColumn 与Xml data type转换。
- 利用SCR文件给注册表解锁
- COM实现取outlook地址簿
- 关于const于pointer
- SQL 2005 体验版 基本安装和使用 (2)
- SMS2003 DB中查询关于patch部署的信息
- HTTP协议中的Tranfer-Encoding:chunked编码解析
- 但求谁可留住这一生
- VS快捷键集锦
- VC++文本编辑器使用
- December 2007