高分寻求Outlook,Outlook Express的通讯录的提取和写入代码。 (100分)

rain_cui 2008-11-04 11:51:42
加精
网上有很多关于wab的文章,但是wab好像有限制,只能读取,请高手帮帮忙,给点代码看看,谢谢!
...全文
1579 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
koseidon 2011-05-26
  • 打赏
  • 举报
回复
期待呀 太感谢了
布学无数 2009-03-13
  • 打赏
  • 举报
回复
mark
Johnsen2009 2009-03-05
  • 打赏
  • 举报
回复
帮顶!
xhj967 2009-02-24
  • 打赏
  • 举报
回复
请问如何删除一项呢?也就是说打开文件之后,传入的指针person如何得到呢?
love514425 2008-11-19
  • 打赏
  • 举报
回复
> 收藏+
love514425 2008-11-19
  • 打赏
  • 举报
回复
> 收藏+
qap22 2008-11-19
  • 打赏
  • 举报
回复
帮顶
SenerityChzr 2008-11-19
  • 打赏
  • 举报
回复
学习……
ycoder 2008-11-16
  • 打赏
  • 举报
回复
马克一个
wgm001 2008-11-15
  • 打赏
  • 举报
回复
使用方法.
CWAB wab; // WAB文件操作对象
ADDRESS_BOOK Person; // 联系人资料
// 创建或打开wab文件
if (!wab.OpenWabFile("文件名"))
return;

// 在此填充 Person 结构.然后调用下面语句.
wab.AddEntry(&Person); // 添加一个联系人
wgm001 2008-11-15
  • 打赏
  • 举报
回复


// 得到WAB模板的ID
//

HRESULT CWAB::HrGetWABTemplateID(ULONG ulObjectType, ULONG *lpcbEID, LPENTRYID *lppEID)
{
LPABCONT lpContainer = NULL;
HRESULT hr = hrSuccess;
SCODE sc = ERROR_SUCCESS;
ULONG ulObjType = 0;
ULONG cbWABEID = 0;
LPENTRYID lpWABEID = NULL;
LPSPropValue lpCreateEIDs = NULL;
LPSPropValue lpNewProps = NULL;
ULONG cNewProps;
ULONG nIndex;

if ( (!m_lpAdrBook) ||
((ulObjectType != MAPI_MAILUSER) && (ulObjectType != MAPI_DISTLIST)) )
{
hr = MAPI_E_INVALID_PARAMETER;
goto out;
}

*lpcbEID = 0;
*lppEID = NULL;

// 得到PAB根容器
//
if (HR_FAILED(hr = m_lpAdrBook->GetPAB( &cbWABEID,
&lpWABEID)))
{
goto out;
}

if (HR_FAILED(hr = m_lpAdrBook->OpenEntry(cbWABEID, // 打开记录的大小
lpWABEID, // 记录的ID
NULL, // 接口NULL
0, // 标志
&ulObjType,
(LPUNKNOWN *)&lpContainer)))
{
goto out;
}

// 打开 PAB 容器成功
// 得到我们的默认的记录ID
if (HR_FAILED(hr = lpContainer->GetProps( (LPSPropTagArray)&ptaCreate,
0,
&cNewProps,
&lpCreateEIDs) ) )
{
goto out;
}

// 检查是否是默认
if ( lpCreateEIDs[icrPR_DEF_CREATE_MAILUSER].ulPropTag != PR_DEF_CREATE_MAILUSER ||
lpCreateEIDs[icrPR_DEF_CREATE_DL].ulPropTag != PR_DEF_CREATE_DL)
{
goto out;
}

if(ulObjectType == MAPI_DISTLIST)
nIndex = icrPR_DEF_CREATE_DL;
else
nIndex = icrPR_DEF_CREATE_MAILUSER;

*lpcbEID = lpCreateEIDs[nIndex].Value.bin.cb;

m_lpWABObject->AllocateBuffer(*lpcbEID, (LPVOID *) lppEID);

if (sc != S_OK)
{
hr = MAPI_E_NOT_ENOUGH_MEMORY;
goto out;
}
CopyMemory(*lppEID,lpCreateEIDs[nIndex].Value.bin.lpb,*lpcbEID);

out:
if (lpCreateEIDs)
m_lpWABObject->FreeBuffer(lpCreateEIDs);

if (lpContainer)
lpContainer->Release();

if (lpWABEID)
m_lpWABObject->FreeBuffer(lpWABEID);

return hr;
}

HRESULT CWAB::OpenWabFile(CString &strFileName)
{
// 在这里初始代wab成员对象
m_bInitialized = FALSE;
m_lpPropArray = NULL;
m_ulcValues = 0;
m_SB.cb = 0;
m_SB.lpb = NULL;

{
TCHAR szWABDllPath[MAX_PATH];
DWORD dwType = 0;
ULONG cbData = sizeof(szWABDllPath);
HKEY hKey = NULL;

*szWABDllPath = '\0';

// 从注册表中查询到wab DLL的位置
// WAB_DLL_PATH_KEY 定义在头文件 wabapi.h
//
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
WAB_DLL_PATH_KEY,
0,
KEY_READ,
&hKey))

RegQueryValueEx( hKey, "", NULL, &dwType,
(LPBYTE) szWABDllPath, &cbData);

if(hKey) RegCloseKey(hKey);

// 如果从注册表查询的路径不为空,则用 loadlibrary 装入 wab32.dll
// WAB_DLL_NAME 定义在头文件 wabapi.h
//
m_hinstWAB = LoadLibrary( (lstrlen(szWABDllPath)) ? szWABDllPath : WAB_DLL_NAME );
}

if(m_hinstWAB)
{
// 如果装入成功,得到它的涵数入点
//
m_lpfnWABOpen = (LPWABOPEN) GetProcAddress(m_hinstWAB, "WABOpen");

if(m_lpfnWABOpen)
{
HRESULT hr = E_FAIL;
WAB_PARAM wp = {0};
wp.cbSize = sizeof(WAB_PARAM);
wp.szFileName = strFileName.GetBuffer(0);
strFileName.ReleaseBuffer();

// 试着打开wab文件,打开成功,设置 m_bInitialized 为真
//
hr = m_lpfnWABOpen(&m_lpAdrBook,&m_lpWABObject,&wp,0);

if(!hr)
m_bInitialized = TRUE;
}
}
return m_bInitialized;
}


有问题请联系偶...
wgm001 2008-11-15
  • 打赏
  • 举报
回复

// 添加一个条目
//

HRESULT CWAB::AddEntry(ADDRESS_BOOK *pAddressEntry)
{
HRESULT hr = S_OK;
ULONG ulObjType = NULL;
LPABCONT lpABC = NULL;
LPMAPIPROP lpProp = NULL;
SPropValue Prop[13];
FILETIME ft;

SBinary pabEID;

// 是否初始化
//
if (!m_bInitialized)
{
TRACE0( "对象未初始化!\n" );
return S_FALSE;
}


ASSERT(pAddressEntry != NULL);
ASSERT(m_lpAdrBook != NULL);
ASSERT(m_lpWABObject != NULL);

// 得到PAB根容器
//
hr = m_lpAdrBook->GetPAB(&pabEID.cb,
(LPENTRYID*)&pabEID.lpb);
if (FAILED(hr))
goto Exit;

// 打开所有在PAB根容器的WAB,并使用MAPI_MODIFY标志
//
hr = m_lpAdrBook->OpenEntry(pabEID.cb,
(ENTRYID*)pabEID.lpb,
NULL,
MAPI_MODIFY,
&ulObjType,
(LPUNKNOWN FAR *)&lpABC );
if (FAILED(hr))
goto Cleanup0;

// 先清零,保存数据到结构
//
ZeroMemory(Prop, sizeof(SPropValue)*13);

Prop[0].ulPropTag = PR_DISPLAY_NAME; // 联系人
Prop[1].ulPropTag = PR_NICKNAME; // 昵称
Prop[2].ulPropTag = PR_GENDER; // 性别
Prop[3].ulPropTag = PR_BIRTHDAY; // 生日
Prop[4].ulPropTag = PR_HOME_ADDRESS_COUNTRY; // 国家/地区
Prop[5].ulPropTag = PR_COMPANY_NAME; // 单位
Prop[6].ulPropTag = PR_DEPARTMENT_NAME; // 部门
Prop[7].ulPropTag = PR_DISPLAY_NAME_PREFIX; // 职称
Prop[8].ulPropTag = PR_MOBILE_TELEPHONE_NUMBER; // 移动电话号码
Prop[9].ulPropTag = PR_OFFICE_TELEPHONE_NUMBER; // 业务电话号码
Prop[10].ulPropTag = PR_PRIMARY_FAX_NUMBER; // 业务传真号码
Prop[11].ulPropTag = PR_HOME_TELEPHONE_NUMBER; // 住宅电话号码
Prop[12].ulPropTag = PR_HOME_FAX_NUMBER; // 住宅传真号码

// 转换生日字段
//
SystemTimeToFileTime(&pAddressEntry->m_stBirthday, &ft);

Prop[0].Value.lpszA = pAddressEntry->m_strDispName.GetBuffer(0); // 联系人
Prop[1].Value.lpszA = pAddressEntry->m_strNickName.GetBuffer(0); // 昵称
Prop[2].Value.i = pAddressEntry->m_iGender; // 性别
Prop[3].Value.ft = ft; // 生日
Prop[4].Value.lpszA = pAddressEntry->m_strRegion.GetBuffer(0); // 国家/地区
Prop[5].Value.lpszA = pAddressEntry->m_strOrganization.GetBuffer(0); // 单位
Prop[6].Value.lpszA = pAddressEntry->m_strDepartment.GetBuffer(0); // 部门
Prop[7].Value.lpszA = pAddressEntry->m_strPosition.GetBuffer(0); // 职位
Prop[8].Value.lpszA = pAddressEntry->m_strMobilePhoneNumber.GetBuffer(0); // 移动电话号码
Prop[9].Value.lpszA = pAddressEntry->m_strOfficePhoneNumber.GetBuffer(0); // 业务电话号码
Prop[10].Value.lpszA = pAddressEntry->m_strOfficeFaxNumber.GetBuffer(0); // 业务传真号码
Prop[11].Value.lpszA = pAddressEntry->m_strHomePhoneNumber.GetBuffer(0); // 住宅电话号码
Prop[12].Value.lpszA = pAddressEntry->m_strHomeFaxNumber.GetBuffer(0); // 住宅传真号码

pAddressEntry->m_strDispName.ReleaseBuffer(); // 联系人
pAddressEntry->m_strNickName.ReleaseBuffer(); // 昵称
pAddressEntry->m_strRegion.ReleaseBuffer(); // 国家/地区
pAddressEntry->m_strOrganization.ReleaseBuffer(); // 单位
pAddressEntry->m_strDepartment.ReleaseBuffer(); // 部门
pAddressEntry->m_strPosition.ReleaseBuffer(); // 职位
pAddressEntry->m_strMobilePhoneNumber.ReleaseBuffer(); // 移动电话号码
pAddressEntry->m_strOfficePhoneNumber.ReleaseBuffer(); // 业务电话号码
pAddressEntry->m_strOfficeFaxNumber.ReleaseBuffer(); // 业务传真号码
pAddressEntry->m_strHomePhoneNumber.ReleaseBuffer(); // 住宅电话号码
pAddressEntry->m_strHomeFaxNumber.ReleaseBuffer(); // 住宅传真号码

// 创建一个条联系人
//
hr = lpABC->CreateEntry(0,
NULL,
0,
&lpProp);
if (FAILED(hr))
goto Cleanup0;
// 设置联系人资料为 13 个属性, 并把属性结构传入参数
//
hr = lpProp->SetProps(13, Prop, NULL);
if (FAILED(hr))
goto Cleanup1;

// 同上,如果不保存,那么所有修改失效, 使用这个函数,
// 必须打开容器时要用MAPI_MODIFY标志,否则会产生访
// 问内存违例
//
hr = lpProp->SaveChanges(0);
if (FAILED(hr))
goto Cleanup1;

Cleanup1:
lpProp->Release();

Cleanup0:
lpABC->Release();

Exit:
return 0;
}

// 显示一个系统对话框,创建一个条目
//

HRESULT CWAB::ShowNewEntryDialog(HWND hWndParent)
{
ULONG cbEID=0;
LPENTRYID lpEID=NULL;

HRESULT hr = hrSuccess;
ULONG cbTplEID = 0;
LPENTRYID lpTplEID = NULL;

// 得到这个模板的ID
//
if(HR_FAILED(hr = HrGetWABTemplateID( MAPI_MAILUSER,
&cbTplEID,
&lpTplEID)))
{
goto out;
}

// 显示添加记录的对话框
//
if (HR_FAILED(hr = m_lpAdrBook->NewEntry((ULONG) hWndParent,
0,
0,NULL,
cbTplEID,lpTplEID,
&cbEID,&lpEID)))
{
goto out;
}

out:
return hr;

}

// 设置单个条目属性
//

BOOL CWAB::SetSingleStringProp(HWND hWnd, ULONG ulPropTag, LPTSTR sz)
{
SPropValue Prop;
BOOL bRet = FALSE;


Prop.ulPropTag = ulPropTag;
Prop.Value.LPSZ = sz;

// 打开缓存中的一个用户对象
//
if(m_SB.lpb && m_SB.cb)
{
LPMAILUSER lpMailUser = NULL;
LPSBinary lpSB = (LPSBinary) &m_SB;
ULONG ulObjType = 0;

// 修改这个对象, 用MAPI_MODIFY标志
//
m_lpAdrBook->OpenEntry(lpSB->cb,
(LPENTRYID) lpSB->lpb,
NULL, // 接口
MAPI_MODIFY, // 标志
&ulObjType,
(LPUNKNOWN *)&lpMailUser);

if(lpMailUser)
{
{
SPropTagArray SPTA;
SPTA.cValues = 1;
SPTA.aulPropTag[0] = ulPropTag;

lpMailUser->DeleteProps(&SPTA, NULL);
}

// 设置新的属性
//
if (!HR_FAILED(lpMailUser->SetProps(1, &Prop, NULL)))
{
// 如果你不调用SaveChanges方法,所做的修改不会被保存
// 正如你如果打开不用MAPI_MODIFY标志,那么会产生访问
// 违例错误
//
lpMailUser->SaveChanges(0);
bRet = TRUE;
}
lpMailUser->Release();
}
}

return bRet;

}

wgm001 2008-11-15
  • 打赏
  • 举报
回复


// 装入一个联系人资料到结构,
//
HRESULT CWAB::LoadAddressEntry(ADDRESS_BOOK &pAddressEntry, const int nIndex)
{
ULONG ulObjType = 0;
LPMAPITABLE lpAB = NULL;
LPSRowSet lpRowAB = NULL;
LPABCONT lpContainer = NULL;
int cNumRows = 0;
ULONG ulCount = 0;

HRESULT hr = E_FAIL;

ULONG lpcbEID;
LPENTRYID lpEID = NULL;

// 得到PAB根容器
//
hr = m_lpAdrBook->GetPAB( &lpcbEID, &lpEID);

ulObjType = 0;

// 打开所有在PAB根容器的WAB
//
hr = m_lpAdrBook->OpenEntry(lpcbEID,
(LPENTRYID)lpEID,
NULL,
0,
&ulObjType,
(LPUNKNOWN *)&lpContainer);

m_lpWABObject->FreeBuffer(lpEID);

lpEID = NULL;

if(HR_FAILED(hr))
goto exit;

// 在WABs根容器里的得到一个所有的容器表
//
hr = lpContainer->GetContentsTable( 0, &lpAB);

if(HR_FAILED(hr))
goto exit;

hr =lpAB->SetColumns( (LPSPropTagArray)&ptaEid, 0 );

if(HR_FAILED(hr))
goto exit;


// 从头开始读
//
hr = lpAB->SeekRow( BOOKMARK_BEGINNING, nIndex, NULL );

if(HR_FAILED(hr))
goto exit;

hr = lpAB->GetRowCount(0, &ulCount);
// 读取表的一行
//
hr = lpAB->QueryRows(1, 0, &lpRowAB);
if(HR_FAILED(hr))
goto exit;

if (lpRowAB)
{
cNumRows = lpRowAB->cRows;
if (cNumRows)
{
// 得到WAB文件里的值
pAddressEntry.m_iGender = lpRowAB->aRow[0].lpProps[ieidPR_GENDER].Value.i;
FILETIME ft = lpRowAB->aRow[0].lpProps[ieidPR_BIRTHDAY].Value.ft;
FileTimeToSystemTime(&ft, &pAddressEntry.m_stBirthday);

CString str = lpRowAB->aRow[0].lpProps[ieidPR_DEPARTMENT_NAME].Value.lpszA;
//pAddressEntry->m_strDepartment.Format("%s", lpRowAB->aRow[0].lpProps[ieidPR_DEPARTMENT_NAME].Value.lpszA);

pAddressEntry.m_strDepartment = CString(lpRowAB->aRow[0].lpProps[ieidPR_DEPARTMENT_NAME].Value.lpszA);
pAddressEntry.m_strDispName = CString(lpRowAB->aRow[0].lpProps[ieidPR_DISPLAY_NAME].Value.lpszA);
pAddressEntry.m_strHomeFaxNumber = CString(lpRowAB->aRow[0].lpProps[ieidPR_HOME_FAX_NUMBER].Value.lpszA);
pAddressEntry.m_strHomePhoneNumber = CString(lpRowAB->aRow[0].lpProps[ieidPR_HOME_TELEPHONE_NUMBER].Value.lpszA);
pAddressEntry.m_strMobilePhoneNumber = CString(lpRowAB->aRow[0].lpProps[ieidPR_MOBILE_TELEPHONE_NUMBER].Value.lpszA);
pAddressEntry.m_strNickName = CString(lpRowAB->aRow[0].lpProps[ieidPR_NICKNAME].Value.lpszA);
pAddressEntry.m_strOfficeFaxNumber = CString(lpRowAB->aRow[0].lpProps[ieidPR_PRIMARY_FAX_NUMBER].Value.lpszA);
pAddressEntry.m_strOfficePhoneNumber = CString(lpRowAB->aRow[0].lpProps[ieidPR_OFFICE_TELEPHONE_NUMBER].Value.lpszA);
pAddressEntry.m_strOrganization = CString(lpRowAB->aRow[0].lpProps[ieidPR_COMPANY_NAME].Value.lpszA);
pAddressEntry.m_strPosition = CString(lpRowAB->aRow[0].lpProps[ieidPR_DISPLAY_NAME_PREFIX].Value.lpszA);
pAddressEntry.m_strRegion = CString(lpRowAB->aRow[0].lpProps[ieidPR_HOME_ADDRESS_COUNTRY].Value.lpszA);

}
}

FreeProws( lpRowAB );

exit:

if ( lpContainer )
lpContainer->Release();

if ( lpAB )
lpAB->Release();

return hr;
}

wgm001 2008-11-15
  • 打赏
  • 举报
回复
文件WabTools.cpp

// WAB.cpp: implementation of the CWAB class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WabTools.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

static const IID IID_IDistList={0x0002030E, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}};
static const IID IID_IMAPITable={0x00020301, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}};
static const IID IID_IMessage={0x00020307, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}};

/************************************************************************/
/* Copyright (c) 2007 by wgm001. ALL RIGHTS RESERVED. */
/************************************************************************/

// 默认构造函数
//

CWAB::CWAB()
{
// 在这里初始代wab成员对象
m_lpAdrBook = NULL;
m_lpWABObject = NULL;
m_bInitialized = FALSE;
m_lpPropArray = NULL;
m_ulcValues = 0;
m_SB.cb = 0;
m_SB.lpb = NULL;
}

// 析构函数
//

CWAB::~CWAB()
{
if(m_SB.lpb)
LocalFree(m_SB.lpb);

if(m_bInitialized)
{
if(m_lpPropArray)
m_lpWABObject->FreeBuffer(m_lpPropArray);

if(m_lpAdrBook)
m_lpAdrBook->Release();

if(m_lpWABObject)
m_lpWABObject->Release();

if(m_hinstWAB)
FreeLibrary(m_hinstWAB);
}
}

// 装入记录到ListCtrl控件
//

HRESULT CWAB::LoadWABContents(CListCtrl *pListView)
{
ULONG ulObjType = 0;
LPMAPITABLE lpAB = NULL;
LPSRowSet lpRowAB = NULL;
LPABCONT lpContainer = NULL;
int cNumRows = 0;
ULONG ulCount = 0;

HRESULT hr = E_FAIL;

ULONG lpcbEID;
LPENTRYID lpEID = NULL;

// 得到PAB根容器
//
hr = m_lpAdrBook->GetPAB( &lpcbEID, &lpEID);

ulObjType = 0;

// 打开所有在PAB根容器的WAB
//
hr = m_lpAdrBook->OpenEntry(lpcbEID,
(LPENTRYID)lpEID,
NULL,
0,
&ulObjType,
(LPUNKNOWN *)&lpContainer);

m_lpWABObject->FreeBuffer(lpEID);

lpEID = NULL;

if(HR_FAILED(hr))
goto exit;

// 在WABs根容器里的得到一个所有的容器表
//
hr = lpContainer->GetContentsTable( 0, &lpAB);

if(HR_FAILED(hr))
goto exit;

hr =lpAB->SetColumns( (LPSPropTagArray)&ptaEid, 0 );

if(HR_FAILED(hr))
goto exit;


// 从头开始读
//
hr = lpAB->SeekRow( BOOKMARK_BEGINNING, 0, NULL );

if(HR_FAILED(hr))
goto exit;

hr = lpAB->GetRowCount(0, &ulCount);
// 读取表的所有行
//
do {
hr = lpAB->QueryRows(1, 0, &lpRowAB);

if(HR_FAILED(hr))
break;

if(lpRowAB)
{
cNumRows = lpRowAB->cRows;

if (cNumRows)
{
// 读取表的各项数据
//
LPTSTR lpsz = lpRowAB->aRow[0].lpProps[ieidPR_DISPLAY_NAME].Value.lpszA;
LPTSTR lpszMobilePhone = lpRowAB->aRow[0].lpProps[ieidPR_MOBILE_TELEPHONE_NUMBER].Value.lpszA;
LPTSTR lpszOfficePhone = lpRowAB->aRow[0].lpProps[ieidPR_OFFICE_TELEPHONE_NUMBER].Value.lpszA;
LPTSTR lpszHomePhone = lpRowAB->aRow[0].lpProps[ieidPR_HOME_TELEPHONE_NUMBER].Value.lpszA;
//int i = lpRowAB->aRow[0].lpProps[ieidPR_NNN].Value.i;

//CString lpszGivenName;
//lpszGivenName.Format("%s", i==2 ? "男" : i==1 ? "女" : "");

LPENTRYID lpEID = (LPENTRYID) lpRowAB->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.lpb;
ULONG cbEID = lpRowAB->aRow[0].lpProps[ieidPR_ENTRYID].Value.bin.cb;

if(lpRowAB->aRow[0].lpProps[ieidPR_OBJECT_TYPE].Value.l == MAPI_MAILUSER) //MAPI_MAILUSER
{
LPSBinary lpSB = NULL;
m_lpWABObject->AllocateBuffer(sizeof(SBinary), (LPVOID *) &lpSB);

if (lpSB)
{
m_lpWABObject->AllocateMore(cbEID, lpSB, (LPVOID *) &(lpSB->lpb));

if (!lpSB->lpb)
{
m_lpWABObject->FreeBuffer(lpSB);
continue ;
}

CopyMemory(lpSB->lpb, lpEID, cbEID);
lpSB->cb = cbEID;

LV_ITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = pListView->GetItemCount();
lvi.iSubItem = 0;
lvi.pszText = lpsz;
lvi.lParam = (LPARAM) lpSB;

// 添加到列表
pListView->InsertItem(&lvi);
pListView->SetItemText(lvi.iItem, 1, lpszMobilePhone);
pListView->SetItemText(lvi.iItem, 2, lpszOfficePhone);
pListView->SetItemText(lvi.iItem, 3, lpszHomePhone);

}
}

}

FreeProws(lpRowAB );
}

}while ( SUCCEEDED(hr) && cNumRows && lpRowAB) ;

exit:

if ( lpContainer )
lpContainer->Release();

if ( lpAB )
lpAB->Release();

return hr;
}

// 释放所占用资源
//

void CWAB::FreeProws(LPSRowSet prows)
{
ULONG irow;
if (!prows)
return;
for (irow = 0; irow < prows->cRows; ++irow)
m_lpWABObject->FreeBuffer(prows->aRow[irow].lpProps);
m_lpWABObject->FreeBuffer(prows);
}

// 清除一个条目的数据
HRESULT CWAB::ClearEntry(ADDRESS_BOOK *pAddressEntry)
{
pAddressEntry->m_iGender = -1;
memset((void*)& pAddressEntry->m_stBirthday, 0, sizeof(pAddressEntry->m_stBirthday));
pAddressEntry->m_strDepartment =
pAddressEntry->m_strDispName =
pAddressEntry->m_strHomeFaxNumber =
pAddressEntry->m_strHomePhoneNumber =
pAddressEntry->m_strMobilePhoneNumber =
pAddressEntry->m_strNickName =
pAddressEntry->m_strOfficeFaxNumber =
pAddressEntry->m_strOfficePhoneNumber =
pAddressEntry->m_strOrganization =
pAddressEntry->m_strPosition =
pAddressEntry->m_strRegion = "";

return S_OK;
}

HRESULT CWAB::GetCountEntry(ULONG &uiCountEntry)
{
ULONG ulObjType = 0;
LPMAPITABLE lpAB = NULL;
LPABCONT lpContainer = NULL;

HRESULT hr = E_FAIL;

ULONG lpcbEID;
LPENTRYID lpEID = NULL;

// 得到PAB根容器
//
hr = m_lpAdrBook->GetPAB( &lpcbEID, &lpEID);
if (HR_FAILED(hr))
return hr;

ulObjType = 0;

// 打开所有在PAB根容器的WAB
//
hr = m_lpAdrBook->OpenEntry(lpcbEID,
(LPENTRYID)lpEID,
NULL,
0,
&ulObjType,
(LPUNKNOWN *)&lpContainer);
if (HR_FAILED(hr))
return hr;

m_lpWABObject->FreeBuffer(lpEID);

lpEID = NULL;

if(HR_FAILED(hr))
goto exit;

// 在WABs根容器里的得到一个所有的容器表
//
hr = lpContainer->GetContentsTable( 0, &lpAB);

if(HR_FAILED(hr))
goto exit;

hr =lpAB->SetColumns( (LPSPropTagArray)&ptaEid, 0 );

if(HR_FAILED(hr))
goto exit;


// 定位到起始位置
//
hr = lpAB->SeekRow( BOOKMARK_BEGINNING, 0, NULL );

if(HR_FAILED(hr))
goto exit;

// 得到行数
hr = lpAB->GetRowCount(0, &uiCountEntry);

exit:
if ( lpContainer )
lpContainer->Release();

if ( lpAB )
lpAB->Release();

return hr;
}
wgm001 2008-11-15
  • 打赏
  • 举报
回复
文件WabTools.h

// WAB.h: interface for the CWAB class.
// 该程序由 wgm001 编写,你可以自由修改此代码,但希望保留此声明.
// 联系QQ 931682527
//////////////////////////////////////////////////////////////////////
#include <wabdefs.h>
#include <wabcode.h>
#include <wabtags.h>
#include <wabiab.h>
#include <wabapi.h>

#if !defined(AFX_WAB_H__1A7B2BFC_E90D_401B_8376_88926E109EFF__INCLUDED_)
#define AFX_WAB_H__1A7B2BFC_E90D_401B_8376_88926E109EFF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// 基本接口定义
//

#define DECLARE_MAPI_INTERFACE_(iface, baseiface) \
DECLARE_INTERFACE_(iface, baseiface)

DECLARE_MAPI_INTERFACE_PTR(IWABObject, LPWABOBJECT); // IWABObject对象定义

STDMETHODIMP WABOpen(LPADRBOOK FAR * lppAdrBook, LPWABOBJECT FAR * lppWABObject, // WabOpen函数指针定义
LPWAB_PARAM lpWP, DWORD Reserved2);

typedef HRESULT (STDMETHODCALLTYPE WABOPEN)( // WabOpen函数指针定义
LPADRBOOK FAR * lppAdrBook,
LPWABOBJECT FAR * lppWABObject,
LPWAB_PARAM lpWP,
DWORD Reserved2
);
typedef WABOPEN FAR * LPWABOPEN;


enum {
ieidPR_DISPLAY_NAME = 0, // 联系人
ieidPR_ENTRYID,
ieidPR_NICKNAME, // 昵称
ieidPR_GENDER, // 性别
ieidPR_BIRTHDAY, // 生日
ieidPR_HOME_ADDRESS_COUNTRY, // 国家/地区
ieidPR_COMPANY_NAME, // 单位
ieidPR_DEPARTMENT_NAME, // 部门
ieidPR_DISPLAY_NAME_PREFIX, // 职称
ieidPR_MOBILE_TELEPHONE_NUMBER, // 移动电话号码
ieidPR_OFFICE_TELEPHONE_NUMBER, // 业务电话号码
ieidPR_PRIMARY_FAX_NUMBER, // 业务传真号码
ieidPR_HOME_TELEPHONE_NUMBER, // 住宅电话号码
ieidPR_HOME_FAX_NUMBER, // 住宅传真号码

ieidPR_OBJECT_TYPE,
ieidMax
};

static const SizedSPropTagArray(ieidMax, ptaEid)=
{
ieidMax,
{
PR_DISPLAY_NAME, // 联系人
PR_ENTRYID,
PR_NICKNAME, // 昵称
PR_GENDER, // 性别
PR_BIRTHDAY, // 生日
PR_HOME_ADDRESS_COUNTRY, // 国家/地区
PR_COMPANY_NAME, // 单位
PR_DEPARTMENT_NAME, // 部门
PR_DISPLAY_NAME_PREFIX, // 职称
PR_MOBILE_TELEPHONE_NUMBER, // 移动电话号码
PR_OFFICE_TELEPHONE_NUMBER, // 业务电话号码
PR_BUSINESS_FAX_NUMBER, // 业务传真号码
PR_HOME_TELEPHONE_NUMBER, // 住宅电话号码
PR_HOME_FAX_NUMBER, // 住宅传真号码

PR_OBJECT_TYPE
}
};


enum {
icrPR_DEF_CREATE_MAILUSER = 0, // 创建MAILUSER对象
icrPR_DEF_CREATE_DL, // 创建默认对象
icrMax
};

const SizedSPropTagArray(icrMax, ptaCreate)=
{
icrMax,
{
PR_DEF_CREATE_MAILUSER, // 创建MAILUSER对象
PR_DEF_CREATE_DL, // 创建默认对象
}
};

enum {
NAME,
ADDR,
EMAIL,
RECIP,
EID,
NUM_RECIP_PROPS
};

static const SizedSPropTagArray(NUM_RECIP_PROPS, sRecipProps) =
{
NUM_RECIP_PROPS, // 行属性
{
PR_DISPLAY_NAME,
PR_ADDRTYPE,
PR_EMAIL_ADDRESS,
PR_RECIPIENT_TYPE,
PR_ENTRYID
}
};

// 通讯录的结构体
//
typedef struct tagADDRESSBOOK
{
CString m_strDispName; // 联系人
CString m_strNickName; // 昵称
int m_iGender; // 性别, 1为女,2为男,0为未指定
SYSTEMTIME m_stBirthday; // 生日, SYSTEMTIME格式
CString m_strRegion; // 国家/地区
CString m_strOrganization; // 单位
CString m_strDepartment; // 部门
CString m_strPosition; // 职位
CString m_strMobilePhoneNumber; // 移动电话号码
CString m_strOfficePhoneNumber; // 业务电话号码
CString m_strOfficeFaxNumber; // 业务传真号码
CString m_strHomePhoneNumber; // 住宅电话号码
CString m_strHomeFaxNumber; // 住宅传真号码
}ADDRESS_BOOK, *LPADDRESS_BOOK;

class CWAB : public CObject
{
public:

BOOL m_bInitialized; // 初始化标志
HINSTANCE m_hinstWAB; // 动态库句柄
LPWABOPEN m_lpfnWABOpen; // WabOpen函数地址
LPADRBOOK m_lpAdrBook; // 通讯录指针
LPWABOBJECT m_lpWABObject; // 通讯录对象
LPSPropValue m_lpPropArray; // 通讯录属性
ULONG m_ulcValues;

SBinary m_SB;


public:
HRESULT OpenWabFile(CString &strFileName);
// 构造wab对象
CWAB();
virtual ~CWAB();

// 装入WAB文件到列表控件
HRESULT LoadWABContents(CListCtrl * pListView);

// 释放所占用资源
void FreeProws(LPSRowSet prows);

// 得到WAB模板的ID
HRESULT HrGetWABTemplateID(ULONG ulObjectType, ULONG *lpcbEID, LPENTRYID *lppEID);

// 添加一个联系人到wab文件
HRESULT AddEntry(ADDRESS_BOOK *pAddressEntry);

// 装入一个联系人资料到结构,
HRESULT LoadAddressEntry(ADDRESS_BOOK &pAddressEntry, const int nIndex);

// 得到联系人个数
HRESULT GetCountEntry(ULONG &uiCountEntry);

// 清空一个条目
HRESULT ClearEntry(ADDRESS_BOOK *pAddressEntry);

// 设置单个条目属性
BOOL SetSingleStringProp(HWND hWnd, ULONG ulPropTag, LPTSTR sz);

// 显示一个系统对话框,创建一个条目
HRESULT ShowNewEntryDialog(HWND hWndParent);

};

#endif // !defined(AFX_WAB_H__1A7B2BFC_E90D_401B_8376_88926E109EFF__INCLUDED_)
JIGSONG 2008-11-07
  • 打赏
  • 举报
回复
pop3&smtp
jiaso 2008-11-07
  • 打赏
  • 举报
回复
等待答案学习
rain_cui 2008-11-06
  • 打赏
  • 举报
回复
Office Outlook 2002,2003我这里也已经做好了,现在就是差Outlook express,关于wab的导入导出,急啊!
wgm001 2008-11-06
  • 打赏
  • 举报
回复
简单啊,我做过这方面的项目,WAB的导入导出,需要源代码的话,联系我,EMAIL:17146738@163.COM
sea_soul 2008-11-06
  • 打赏
  • 举报
回复
加载更多回复(11)

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧