I'm a beginner in terms of C++ but I'm trying to create a script that changes the default address book in Outlook 2010. At first I looked at changing the registry which works for an individual user, unfortunately all the registry values are unique to the user though so it can't be rolled out. I then found a C++ script which works perfectly. Unfortunately it doesn't work when a certain option is selected in Outlook, any other option it's fine, but when "Choose automatically" is picked (Which it is by default in my case) it can't change it.
![Posted Image]()
So, the script I found is here and the code I know needs to go in is located here. Unfortunately, being the newbie to C++ that I am, I can't seem to put them together. Any help would be much appreciated.
Thanks in advance.
The main script is:
It seems that this part needs to go in somewhere:
And also:

So, the script I found is here and the code I know needs to go in is located here. Unfortunately, being the newbie to C++ that I am, I can't seem to put them together. Any help would be much appreciated.
Thanks in advance.
The main script is:
//
// Set MAPI Default Address List when opening the Outlook Address Book
//
// If Outlook is already open, it may need to be restarted for change to take effect.
//
// Shawn Poulson <spoulson@explodingcoder.com>, 2008.10.24
//
#include "stdafx.h"
#include <mapix.h>
#include <mapiutil.h>
#include <string>
#include <iostream>
using namespace std;
STDMETHODIMP MAPILogon(LPMAPISESSION *lpMAPISession);
void MAPILogoff(IMAPISession &Session);
STDMETHODIMP SetDefaultAddressList(IMAPISession &Session, const string &AddressList);
STDMETHODIMP ResolveAddressList(IMAPISession &Session, const string &AddressList, LPVOID pAllocLink, ULONG *cbEntry, LPENTRYID *Entry);
string GetFilename(const char *Pathname);
int main(int argc, char *argv[]) {
HRESULT hr = S_OK;
if (argc != 2) {
cout << "Set MAPI default address list" << endl;
cout << "Shawn Poulson <spoulson@explodingcoder.com>, 2008.10.24" << endl;
cout << endl;
cout << "Usage: " << GetFilename(argv[0]) << " \"Address List\"" << endl;
cout << endl;
cout << "Example lists:" << endl;
cout << " All Contacts (All Outlook contacts folders)" << endl;
cout << " Contacts (Default Outlook contacts)" << endl;
cout << " Global Address List" << endl;
cout << " All Address Lists (All lists defined in Exchange)" << endl;
cout << " All Users (All Exchange users)" << endl;
return 1;
}
// Initialize MAPI
hr = MAPIInitialize(NULL);
if (FAILED(hr)) {
cerr << "Error initializing MAPI" << endl;
goto Exit;
}
// Logon to MAPI with default profile
LPMAPISESSION lpSession;
hr = MAPILogon(&lpSession);
if (FAILED(hr)) goto Exit;
if (lpSession != NULL) {
// Save SearchList
SetDefaultAddressList(*lpSession, string(argv[1]));
// Clean up
MAPILogoff(*lpSession);
hr = lpSession->Release();
if (FAILED(hr)) {
cerr << "Warning: lpSession->Release() failed" << endl;
}
}
else {
cerr << "Error logging on to MAPI" << endl;
goto Exit;
}
Exit:
MAPIUninitialize();
return 0;
}
// Logon to MAPI session with default profile
STDMETHODIMP MAPILogon(LPMAPISESSION *lppSession) {
HRESULT hr = MAPILogonEx(NULL, NULL, NULL, MAPI_USE_DEFAULT, lppSession);
if (FAILED(hr)) {
cerr << "Error logging on to MAPI." << endl;
}
return hr;
}
// Logoff MAPI session
void MAPILogoff(IMAPISession &Session) {
HRESULT hr = Session.Logoff(NULL, NULL, 0);
if (FAILED(hr)) {
cerr << "Warning: MAPI log off failed" << endl;
}
}
// Set default address list by name
STDMETHODIMP SetDefaultAddressList(IMAPISession &Session, const string &AddressList) {
HRESULT hr = S_OK;
// Initialize memory allocation
LPVOID pAllocLink = NULL;
MAPIAllocateBuffer(0, &pAllocLink);
// Resolve address list name to ENTRYID
ULONG cbEntryID;
LPENTRYID lpEntryID;
hr = ResolveAddressList(Session, AddressList, pAllocLink, &cbEntryID, &lpEntryID);
if (FAILED(hr)) {
cerr << "Unable to resolve address list name '" << AddressList << "'." << endl;
return hr;
}
// Open address book
LPADRBOOK lpAddrBook;
hr = Session.OpenAddressBook(NULL, NULL, NULL, &lpAddrBook);
if (FAILED(hr)) {
cerr << "Error getting MAPI Address book." << endl;
goto Exit;
}
// Display feedback
TraceDefaultDir(*lpAddrBook);
cout << "Setting default address list: " << AddressList << endl;
// Set default address list
hr = lpAddrBook->SetDefaultDir(cbEntryID, lpEntryID);
if (FAILED(hr)) {
cerr << "Error setting default address list" << endl;
goto Exit;
}
TraceDefaultDir(*lpAddrBook);
Exit:
if (pAllocLink) MAPIFreeBuffer(pAllocLink);
return hr;
}
// Resolve address list name to ENTRYID
// Memory is allocated through MAPIAllocateBuffer using pAllocLink
STDMETHODIMP ResolveAddressList(IMAPISession &Session, const string &AddressList, LPVOID pAllocLink, ULONG *cbEntry, LPENTRYID *Entry) {
HRESULT hr = S_OK;
// Setup struct specifying MAPI fields to query
enum {
abPR_ENTRYID, // Field index for ENTRYID
abPR_DISPLAY_NAME_A, // Field index for display name
abNUM_COLS // Automatically set to number of fields
};
static SizedSPropTagArray(abNUM_COLS, abCols) = {
abNUM_COLS, // Num fields to get (2)
PR_ENTRYID, // Get ENTRYID struct
PR_DISPLAY_NAME_A // Get display name
};
// Open address book
LPADRBOOK lpAddrBook;
hr = Session.OpenAddressBook(NULL, NULL, NULL, &lpAddrBook);
if (FAILED(hr)) {
cerr << "Error getting MAPI Address book." << endl;
goto Exit;
}
ULONG ulObjType;
LPMAPICONTAINER pIABRoot = NULL;
hr = lpAddrBook->OpenEntry(0, NULL, NULL, 0, &ulObjType, (LPUNKNOWN *)&pIABRoot);
if (FAILED(hr) || ulObjType != MAPI_ABCONT) {
cerr << "Error opening MAPI Address book root entry." << endl;
if (SUCCEEDED(hr)) hr = E_UNEXPECTED;
goto Cleanup;
}
// Query MAPI for all address lists
LPMAPITABLE pHTable = NULL;
hr = pIABRoot->GetHierarchyTable(CONVENIENT_DEPTH, &pHTable);
if (FAILED(hr)) {
cerr << "Error obtaining MAPI address list hierarchy." << endl;
goto Cleanup;
}
LPSRowSet pQueryRows = NULL;
hr = HrQueryAllRows(pHTable, (LPSPropTagArray)&abCols, NULL, NULL, 0, &pQueryRows);
if (FAILED(hr)) {
cerr << "Error getting MAPI address lists." << endl;
goto Cleanup;
}
// Is AddressList in the pQueryRows list?
for (ULONG i = 0; i < pQueryRows->cRows && pQueryRows->aRow[i].lpProps[abPR_DISPLAY_NAME_A].ulPropTag == PR_DISPLAY_NAME_A; i++) {
SRow &QueryRow = pQueryRows->aRow[i];
string ContainerName = QueryRow.lpProps[abPR_DISPLAY_NAME_A].Value.lpszA;
if (ContainerName == AddressList) {
// Found a match!
// Build ENTRYID struct
ULONG cbNewEntryID = QueryRow.lpProps[abPR_ENTRYID].Value.bin.cb;
LPENTRYID lpNewEntryID;
MAPIAllocateMore(cbNewEntryID, pAllocLink, (LPVOID *)&lpNewEntryID);
memcpy(lpNewEntryID, QueryRow.lpProps[abPR_ENTRYID].Value.bin.lpb, cbNewEntryID);
// Set return values
*cbEntry = cbNewEntryID;
*Entry = lpNewEntryID;
// Break out
break;
}
}
Cleanup:
if (lpAddrBook) lpAddrBook->Release();
Exit:
return hr;
}
string GetFilename(const char *Pathname) {
char fname[_MAX_FNAME];
_splitpath_s(Pathname, NULL, 0, NULL, 0, fname, sizeof(fname), NULL, 0);
return string(fname);
}
It seems that this part needs to go in somewhere:
DEFINE_OLEGUID(IID_CAPONE_PROF, 0x00020d0a, 0, 0);
#define PR_AB_CHOOSE_DIRECTORY_AUTOMATICALLY PROP_TAG( PT_BOOLEAN, 0x3D1C)
hr = lpSession.OpenProfileSection((LPMAPIUID)&IID_CAPONE_PROF, NULL, MAPI_MODIFY , &lpProfileSection);
if (SUCCEEDED ( hr = HrGetOneProp(lpProfileSection, PR_AB_CHOOSE_DIRECTORY_AUTOMATICALLY, &lpPropValue))){
lpPropValue->Value.l = 0;
if (SUCCEEDED(hr = HrSetOneProp(lpProfileSection, lpPropValue)))
And also:
MAPI::SetProp