2,586
社区成员




// 得到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;
}
// 添加一个条目
//
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;
}
// 装入一个联系人资料到结构,
//
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;
}
// 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;
}
// 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_)