Share via


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);
 }
}