Share via


Adding a New Contact with CDOEX

Topic Last Modified: 2006-06-12

Visual C++

Note

The following example uses a file URL with the Exchange OLE DB (ExOLEDB) provider. The ExOLEDB provider also supports The HTTP: URL Scheme. Using The HTTP: URL Scheme allows both client and server applications to use a single URL scheme.

//Adding a New Contact with CDOEx

#import <cdoex.dll> rename_namespace("CDO") raw_interfaces_only

#include <stdio.h>
#include <tchar.h>

enum ConnectModeEnum
{
    adModeUnknown = 0,
    adModeRead = 1,
    adModeWrite = 2,
    adModeReadWrite = 3,
    adModeShareDenyRead = 4,
    adModeShareDenyWrite = 8,
    adModeShareExclusive = 12,
    adModeShareDenyNone = 16,
    adModeRecursive = 4194304
};

enum RecordCreateOptionsEnum
{
    adCreateCollection = 8192,
    adCreateStructDoc = -2147483648,
    adCreateNonCollection = 0,
    adOpenIfExists = 33554432,
    adCreateOverwrite = 67108864,
    adFailIfNotExists = -1
};

enum RecordOpenOptionsEnum
{
    adOpenRecordUnspecified = -1,
    adOpenSource = 8388608,
    adOpenAsync = 4096,
    adDelayFetchStream = 16384,
    adDelayFetchFields = 32768
};

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

struct StartOle {
    StartOle() { CoInitialize(NULL); }
    ~StartOle() { CoUninitialize(); }
} _inst_StartOle;

void main(int argc, char** argv)
{
   HRESULT hr = S_OK;

   if(argc != 2)
   {
         printf("Usage: CreateContact\r\n");
         printf("Example: CreateContact \"file://./backofficestorage/mydomain.contoso.com/MBX/User1/Contacts\"\n");
         exit(0);
   }

   wchar_t* folderURL = NULL;
   size_t size;
   size = mbstowcs(NULL,argv[1],0);
   folderURL = (wchar_t*)malloc(size * sizeof(wchar_t*) + 1);
   mbstowcs(folderURL,argv[1],size+1);

   BSTR bstrFolderURL = SysAllocString(folderURL);

   try
   {
      CDO::IPersonPtr pPerson(_uuidof(CDO::Person));
      CDO::IDataSourcePtr pDsrc;

      pPerson->put_FirstName(L"John");
      pPerson->put_LastName(L"Smith");
      pPerson->put_HomeCity(L"Los Angeles");
      pPerson->put_HomeState(L"California");
      pPerson->put_Email(L"JohnSmith@contoso.com");
      pPerson->get_DataSource(&pDsrc);

      // Note: using adCreateOverwrite may cause an existing
      // contact to be overwritten.
      hr = pDsrc->SaveToContainer(bstrFolderURL,
                           0,
                           (enum CDO::ConnectModeEnum) adModeReadWrite,
                           (enum CDO::RecordCreateOptionsEnum)adCreateOverwrite,
                           (enum CDO::RecordOpenOptionsEnum)adOpenSource,
                           L"",
                           L"");

      if (SUCCEEDED(hr))
         _tprintf(_T("Contact created\n"));

   }
   catch(_com_error &e)
   {
      dump_com_error(e);
   }

   SysFreeString(bstrFolderURL);
}