PropertyAccessor object in Outlook 2007 OOM
As mentioned in the https://support.microsoft.com/kb/266353, programmatically reading MAPI properties by using APIs such as Extended MAPI the PropertyAccessor object in the Microsoft Office Outlook 2007 object model is supported.
Here's how we do it in C++.
#pragma warning(disable:4146)
#import "C:\Windows\System32\stdole2.tlb" rename_namespace("Outlook")
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll" rename_namespace("Outlook")
#import "C:\Program Files\Microsoft Office\OFFICE12\msoutl.olb" rename_namespace("Outlook")
#pragma warning(default:4146)
#include <stdio.h>
#include <tchar.h>
using namespace Outlook;
struct StartOle
{
StartOle()
{
CoInitialize(NULL);
}
~StartOle()
{
CoUninitialize();
}
}_inst_StartOle;
void dump_com_error(_com_error &e)
{
_tprintf(_T("Oops - hit an error!\n"));
_tprintf(_T("\a\tCode = %08lx\n"), e.Error());
_tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
_tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
_tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
}
void main(int argc, char* argv[])
{
try
{
_ApplicationPtr pApp("Outlook.Application");
_NameSpacePtr pNameSpace;
pNameSpace = pApp->GetNamespace(L"MAPI");
MAPIFolderPtr pAppointmentMAPIFolder;
pAppointmentMAPIFolder = pNameSpace->GetDefaultFolder(olFolderCalendar);
_ItemsPtr pItems;
_AppointmentItemPtr pAppointmentItem;
pItems = pAppointmentMAPIFolder->GetItems();
printf("No of items : %d\n", pItems->Count);
pAppointmentItem = pItems->GetFirst();
/* The following code uses GetPropertyAccessor: gets the user property WORKS */
_PropertyAccessorPtr pPropAccPtr;
pPropAccPtr = pAppointmentItem->GetPropertyAccessor();
_variant_t var;
var = pPropAccPtr->GetProperty(L"https://schemas.microsoft.com/mapi/string/{00020329-0000-0000-c000-000000000046}/SomeID");
/* The following code uses GetUserProperties: does not get the user property DOES NOT WORK */
//UserPropertiesPtr pUP;
//pUP = pAppointmentItem->GetUserProperties();
//UserPropertyPtr uPP = pUP->Item(L"SomeID");
//_variant_t var;
//var = pPropAccPtr->GetProperty(L"https://schemas.microsoft.com/mapi/string/{00020329-0000-0000-c000-000000000046}/SomeID");
//var = uPP->GetValue();
}
catch(_com_error &e)
{
dump_com_error(e);
}
}