HOWTO: Create an Entry in the Personal Address BookLast reviewed: January 6, 1998Article ID: Q178172 |
The information in this article applies to:
SUMMARYThis article details the process of creating an entry in the Personal Address Book using Extended MAPI and C++. Below are step-by-step instructions and sample code for the process.
MORE INFORMATION
Step-by-Step Instructions
Sample Code
// NOTE: You will need to add Mapi32.lib as an input module in the
// Link tab of the Project Settings dialog box.
#define INITGUID
#define USES_IID_IMAPITable
// See the "References" section below for information on
// obtaining this header file.
#include "MAPIASST.H" // For MAPI_ASSERT_EX and SHOWTABLE
#include <stdio.h>
#include <mapiutil.h>
#include <conio.h> // Just for getch()
#include <mapidefs.h>
#include <mapiguid.h>
HRESULT AddToPab(LPTSTR lpszDisplayName, LPTSTR lpszAddress,
LPTSTR lpszAddrType);
// This gives an example of calling the AddToPab function.
void main()
{
HRESULT hr = S_OK;
char sDone[64];
hr = AddToPab("Created By MyCode", "email@domain.com", "SMTP");
sprintf(sDone, "Done, hr=0x%x\n", hr);
OutputDebugString(sDone);
getch();
}
HRESULT AddToPab(LPTSTR lpszDisplayName, LPTSTR lpszAddress,
LPTSTR lpszAddrType)
{
HRESULT hr = S_OK;
LPMAPISESSION lpSession = NULL;
LPADRBOOK lpAddrbk = NULL;
LPMAPICONTAINER lpAddrRoot = NULL;
LPMAPITABLE lpBooks = NULL;
ULONG ulCount = NULL;
ULONG ulObjType = NULL;
LPSRowSet pRows = NULL;
SRestriction srName;
SPropValue spv;
LPSPropValue lpProp;
LPABCONT lpABC = NULL;
LPMAPITABLE lpTPLTable = NULL;
LPMAPIPROP lpNewEntry = NULL;
SizedSPropTagArray(2, Columns) =
{2, {PR_DISPLAY_NAME, PR_ENTRYID}};
SizedSPropTagArray(2, TypeColumns) =
{2, {PR_ADDRTYPE, PR_ENTRYID}};
// Initialize MAPI Subsystem.
hr = MAPIInitialize(NULL);
MAPI_ASSERT_EX(hr);
// Logon to MAPI.
hr = MAPILogonEx(0,NULL,NULL,MAPI_LOGON_UI,&lpSession);
MAPI_ASSERT_EX(hr);
hr = lpSession->OpenAddressBook(0,NULL,0,&lpAddrbk);
MAPI_ASSERT_EX(hr);
// Open root address book (container).
hr = lpAddrbk->OpenEntry(0L,NULL,NULL,0L,&ulObjType,
(LPUNKNOWN*)&lpAddrRoot);
MAPI_ASSERT_EX(hr);
// Get a table of all of the Address Books.
hr = lpAddrRoot->GetHierarchyTable(0, &lpBooks);
MAPI_ASSERT_EX(hr);
//SHOWTABLE(lpBooks);
// Restrict the table to just it's name and ID.
hr = lpBooks->SetColumns((LPSPropTagArray)&Columns, 0);
MAPI_ASSERT_EX(hr);
// Build a restriction to find the Personal Address Book.
srName.rt = RES_PROPERTY;
srName.res.resProperty.relop = RELOP_EQ;
srName.res.resProperty.ulPropTag = PR_DISPLAY_NAME;
srName.res.resProperty.lpProp = &spv;
spv.ulPropTag = PR_DISPLAY_NAME;
spv.Value.lpszA = "Personal Address Book"; // Address Book to open
// Apply the restriction
hr = lpBooks->Restrict(&srName,0);
MAPI_ASSERT_EX(hr);
// Get the total number of rows returned. Typically, this will be 1.
hr = lpBooks->GetRowCount(0,&ulCount);
MAPI_ASSERT_EX(hr);
// Get the row properties (trying to get the EntryID).
hr = lpBooks->QueryRows(ulCount,0,&pRows);
MAPI_ASSERT_EX(hr);
// Get a pointer to the properties.
lpProp = &pRows->aRow[0].lpProps[1]; // Point to the EntryID Prop
// Open the Personal Address Book (PAB).
hr = lpAddrbk->OpenEntry(lpProp->Value.bin.cb,
(ENTRYID*)lpProp->Value.bin.lpb,
NULL,MAPI_MODIFY,&ulObjType,
(LPUNKNOWN FAR *)&lpABC);
MAPI_ASSERT_EX(hr);
// Get a table of templates for the address types.
hr = lpABC->OpenProperty( PR_CREATE_TEMPLATES,
(LPIID) &IID_IMAPITable,
0, 0,
(LPUNKNOWN *)&lpTPLTable);
MAPI_ASSERT_EX(hr);
//SHOWTABLE(lpTPLTable);
// Restrict the table to just it's name and ID
hr = lpTPLTable->SetColumns((LPSPropTagArray)&TypeColumns, 0);
MAPI_ASSERT_EX(hr);
// Get the EntryID of the Internet Mail Address Template
// Build a restriction to find the SMTP Template
srName.rt = RES_PROPERTY;
srName.res.resProperty.relop = RELOP_EQ;
srName.res.resProperty.ulPropTag = PR_ADDRTYPE;
srName.res.resProperty.lpProp = &spv;
spv.ulPropTag = PR_ADDRTYPE;
spv.Value.lpszA = lpszAddrType; // Name of Template ID you want
// passed into the function
// Apply the restriction
hr = lpTPLTable->Restrict(&srName,0);
MAPI_ASSERT_EX(hr);
// Get the total number of rows returned. Typically, this will be 1.
hr = lpTPLTable->GetRowCount(0,&ulCount);
MAPI_ASSERT_EX(hr);
// Get the row properties (trying to get the EntryID).
hr = lpTPLTable->QueryRows(ulCount,0,&pRows);
// Get a pointer to the properties.
lpProp = &pRows->aRow[0].lpProps[1]; // Point to the EntryID of
// the template.
// Now, you can actually create the new entry.
// It is blank when created.
hr = lpABC->CreateEntry(lpProp->Value.bin.cb,
(ENTRYID*)lpProp->Value.bin.lpb,
CREATE_CHECK_DUP_LOOSE,
&lpNewEntry);
MAPI_ASSERT_EX(hr);
if (S_OK == hr && lpNewEntry)
{
// Ok, now you need to set some properties on the new Entry.
const unsigned long cProps = 3;
SPropValue aPropsMesg[cProps];
LPSPropProblemArray lpPropProblems = NULL;
// Setup your properties.
aPropsMesg[0].dwAlignPad = 0;
aPropsMesg[0].ulPropTag = PR_EMAIL_ADDRESS;
aPropsMesg[0].Value.LPSZ = lpszAddress;
aPropsMesg[1].dwAlignPad = 0;
aPropsMesg[1].ulPropTag = PR_DISPLAY_NAME;
aPropsMesg[1].Value.LPSZ = lpszDisplayName;
aPropsMesg[2].dwAlignPad = 0;
aPropsMesg[2].ulPropTag = PR_ADDRTYPE;
aPropsMesg[2].Value.LPSZ = lpszAddrType;
// Set the properties on the object.
hr = lpNewEntry->SetProps(cProps, aPropsMesg, &lpPropProblems);
MAPI_ASSERT_EX(hr);
// Explictly save the changes to the new entry.
hr = lpNewEntry->SaveChanges(NULL);
if (MAPI_E_COLLISION == hr)
{
// You tried to add an entry that already exists.
OutputDebugString("Collision! The entry Already Exists.\n");
hr = S_OK; // Handled the error....
}
MAPI_ASSERT_EX(hr);
}
// Cleanup
if (lpNewEntry) lpNewEntry->Release();
if (lpTPLTable) lpTPLTable->Release();
if (lpABC) lpABC->Release();
if (lpBooks) lpBooks->Release();
if (lpAddrRoot) lpAddrRoot->Release();
if (lpAddrbk) lpAddrbk->Release();
if (lpSession) lpSession->Release();
FreeProws(pRows);
return hr;
}
REFERENCESFor information on how to obtain the Mapiasst.h header file that contains helpful debugging routines, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q177542 TITLE : FILE: MAPIASST.EXE: MAPI ASSERT Debug Routines |
Additional query words: Personal Address Book PAB CreateEntry Create Entry
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |