// 添加一个条目
//
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;
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;
}