Share via


Modifying Objects Using CDOEX

Modifying Objects Using CDOEX

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.

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.

// Change folder names, modify appointments and contacts
// Modify the code where you see TODO and make sure the objects or properties exist.

#include <activeds.h> 
#include <stdio.h>
#include <conio.h>
#import <msado15.dll> no_namespace rename("EOF","adoEOF")
#import <cdoex.dll> no_namespace


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


void dump_com_error(_com_error &e)
{
    printf("Oops - hit an error!\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    printf("\tSource = %s\n", (LPCTSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCTSTR) bstrDescription);
}


void ModifyObjects(_bstr_t strDomainName, _bstr_t strLocalPathOfSourceFolder, _bstr_t strSearchSql);
HRESULT GetDomainName(BSTR * bstrDomainName);


void main(void)
{
    _bstr_t strDomainName;
    _bstr_t strLocalPathOfSourceFolder;
    _bstr_t strSourceFolderUrl;
    _bstr_t strSearchSql;
    _bstr_t strUser;
    
          HRESULT hr = S_OK; 
          BSTR bstrDomainDNSName;
 
          // Get your domain name. 
          hr = GetDomainName(&bstrDomainDNSName);   
 
             strDomainName = (_bstr_t)bstrDomainDNSName; 

    strUser = "user1";  // TODO
    
    // Sample 1: List appointments in the user's Calendar folder.
    strLocalPathOfSourceFolder = "MBX/" + strUser + "/Calendar";  

    // Create the SQL query for the recordset (appointments).
    strSourceFolderUrl = "file://./backofficestorage/" + strDomainName + "/" + strLocalPathOfSourceFolder;

    strSearchSql = "select ";
    strSearchSql = strSearchSql + "\"urn:schemas:mailheader:content-class\"";
    strSearchSql = strSearchSql + ", \"DAV:href\"";
    strSearchSql = strSearchSql + ", \"DAV:displayname\"";
    strSearchSql = strSearchSql + ", \"DAV:isfolder\"";
    strSearchSql = strSearchSql + ", \"DAV:iscollection\"";
    strSearchSql = strSearchSql + ", \"urn:schemas:httpmail:subject\"";
    strSearchSql = strSearchSql + " from scope ('shallow traversal of ";
    strSearchSql = strSearchSql + "\"" + strSourceFolderUrl + "\"" + "')";
    strSearchSql = strSearchSql + " WHERE \"DAV:ishidden\" = false";
    strSearchSql = strSearchSql + " AND \"DAV:isfolder\" = false";
  
    // TODO
    strSearchSql = strSearchSql + " AND \"urn:schemas:httpmail:subject\" = 'Test Appointment'";   
    
    ModifyObjects(strDomainName, strLocalPathOfSourceFolder, strSearchSql);
    
    
    // Sample 2: Modify the contacts with the nickname "Small" in Contacts.
    strLocalPathOfSourceFolder = "MBX/" + strUser  + "/Contacts";   

    // Create the SQL query for the recordset (appointments).
    strSourceFolderUrl = "file://./backofficestorage/" + \
                 strDomainName + "/" + strLocalPathOfSourceFolder;

    strSearchSql = "select ";
    strSearchSql = strSearchSql + "\"urn:schemas:mailheader:content-class\"";
    strSearchSql = strSearchSql + ", \"DAV:href\"";
    strSearchSql = strSearchSql + ", \"DAV:displayname\"";
    strSearchSql = strSearchSql + ", \"DAV:isfolder\"";
    strSearchSql = strSearchSql + ", \"DAV:iscollection\"";
    strSearchSql = strSearchSql + ", \"urn:schemas:contacts:nickname\"";
    strSearchSql = strSearchSql + " from scope ('shallow traversal of ";
    strSearchSql = strSearchSql + "\"" + strSourceFolderUrl + "\"" + "')";
    strSearchSql = strSearchSql + " WHERE \"DAV:ishidden\" = false";
    strSearchSql = strSearchSql + " AND \"DAV:isfolder\" = false";

    // TODO
    strSearchSql = strSearchSql + " AND \"urn:schemas:contacts:nickname\" = 'Small'";   

     
    ModifyObjects(strDomainName, strLocalPathOfSourceFolder, strSearchSql);
    
    
    // Sample 3: Modify the name of the "TestFolder" folder.
    strLocalPathOfSourceFolder = "MBX/" + strUser + "/Outbox";   
 
    // Create the SQL query for the recordset (appointments).
    strSourceFolderUrl = "file://./backofficestorage/" + strDomainName + "/" + strLocalPathOfSourceFolder;

    strSearchSql = "select ";
    strSearchSql = strSearchSql + "\"urn:schemas:mailheader:content-class\"";
    strSearchSql = strSearchSql + ", \"DAV:href\"";
    strSearchSql = strSearchSql + ", \"DAV:displayname\"";
    strSearchSql = strSearchSql + ", \"DAV:isfolder\"";
    strSearchSql = strSearchSql + ", \"DAV:iscollection\"";
    strSearchSql = strSearchSql + ", \"urn:schemas:httpmail:subject\"";
    strSearchSql = strSearchSql + " from scope ('shallow traversal of ";
    strSearchSql = strSearchSql + "\"" + strSourceFolderUrl + "\"" + "')";
    strSearchSql = strSearchSql + " WHERE \"DAV:ishidden\" = false";
    strSearchSql = strSearchSql + " AND \"DAV:isfolder\" = true";

    // TODO
    strSearchSql = strSearchSql + " AND \"DAV:displayname\" = 'TestFolder'";   
    
    ModifyObjects(strDomainName, strLocalPathOfSourceFolder, strSearchSql);
    
}

// Modify objects and specially
// - change folder name
// - modify appointment and contact

void ModifyObjects(_bstr_t strDomainName, _bstr_t strLocalPathOfSourceFolder, _bstr_t strSearchSql)
{
   _ConnectionPtr conn(_uuidof(Connection));
   _RecordsetPtr Rst(_uuidof(Recordset));
       _bstr_t strSourceFolderUrl;
        

   HRESULT hr = S_OK;

   
   try
   {
              // Set the strURL to the location of the folders.
              strSourceFolderUrl = "file://./backofficestorage/" + strDomainName + "/" + strLocalPathOfSourceFolder;
              printf("strSourceFolderUrl : %s\n", (char *)strSourceFolderUrl);
      
      // Open the connection.
      conn->Provider = "Exoledb.DataSource";      
      hr = conn->Open(strSourceFolderUrl,"","",0);
      
      if (conn->State == adStateOpen)
         printf("Connection Opened!\n");
      else
         printf("Connection failed!\n");
      
  
      // Open the recordset.
      hr = Rst->Open(strSearchSql,conn->ConnectionString,adOpenForwardOnly,adLockOptimistic,0);

      // Test to see if the recordset opened without error.
      if (Rst->State == adStateOpen)
         printf("Rst Opened Successfully!\n");
      else
         printf("Rst Opened Failed!\n");


              printf("Objects founded # = %d\n", Rst->RecordCount);


      // Check to determine if any objects were found.
      if (Rst->RecordCount == 0)
      {
                     printf("No object needs to be modified!\n");
         return;
      }
           
      // Some objects were found.
      hr = Rst->MoveFirst();

      _bstr_t strResult = "";
      while (VARIANT_FALSE == Rst->adoEOF)
      {   
                    _bstr_t strObjectUrl;
                  _bstr_t strContentClass;
                  bool boolIsCollection;

        
         // Retrieve some properties. 
         FieldsPtr Flds = Rst->GetFields(); 
         FieldPtr Fld = Flds->GetItem("DAV:href");
         strObjectUrl = (_bstr_t)(Fld->Value);

              
         Fld = Flds->GetItem("urn:schemas:mailheader:content-class");
         strContentClass = (_bstr_t)(Fld->Value);

         Fld = Flds->GetItem("DAV:iscollection");
         boolIsCollection = (bool)(Fld->Value);

         // printf("Content-clase = %s\n", (char *)strContentClass);


                  if (boolIsCollection)
         {
                 Fld = Flds->GetItem("DAV:displayname");
                printf("Folder : %s\n", (char *)(_bstr_t)(Fld->Value));

                         _RecordPtr Rec(__uuidof(Record));
            _bstr_t strFolderNewName = "ModifiedName";


                   // Open the record.   
                   hr = Rec->Open((_variant_t)strObjectUrl,
                   conn->ConnectionString,
                  adModeReadWrite, 
                  adFailIfNotExists, 
                  adOpenSource,
                  bstr_t(), bstr_t());


                   // Use move to change the folder name. 
                   Rec->MoveRecord(strObjectUrl, 
                                strSourceFolderUrl + "/"  + strFolderNewName,
                                "", "", 
                                adMoveOverWrite, 
                               false);

                   // Close the record.
                   Rec->Close();

               // Clean up.
               Rec = NULL;

         }
         else{
            if (wcsicmp(strContentClass, (_bstr_t)"urn:content-classes:message") == 0)
            {
             // You will not modify the message, but just check some properties for the moment.   // TODO
                            IMessagePtr pMsg(__uuidof(Message));
              IDataSourcePtr pDsrc;

              hr = pMsg->get_DataSource(&pDsrc);

              hr = pDsrc->Open((_bstr_t)strObjectUrl,
                                NULL,
                       adModeReadWrite,
                       adFailIfNotExists,
                       adOpenSource,
                       bstr_t(), bstr_t());

              // Get the date received.
              Flds = pMsg->GetFields();
                    Fld = Flds->GetItem("urn:schemas:httpmail:datereceived");


                            printf("Message\n"); 
                            printf("Sender :%s\n", (char *)(_bstr_t)pMsg->Sender); 
                            printf("TimeReceived :%s\n\n", (char *)(_bstr_t)(Fld->Value));

              // Clean up.
              pDsrc = NULL;
              pMsg = NULL;
                       
            }
            else if (wcsicmp(strContentClass, (_bstr_t)"urn:content-classes:person") == 0)
            {

                            IPersonPtr pPerson(__uuidof(Person));
              IDataSourcePtr pDsrc;

              hr = pPerson->get_DataSource(&pDsrc);

              hr = pDsrc->Open( (_bstr_t)strObjectUrl,
                                NULL,
                      adModeReadWrite,
                      adFailIfNotExists,
                      adOpenSource,
                      bstr_t(), bstr_t());

              // Change a property directly.
              pPerson->Title = (_bstr_t)"Developer";

              // Change a property by using fields.
              Flds = pPerson->GetFields(); 
              Fld = Flds->GetItem("urn:schemas:contacts:department");
              Fld->Value = (_bstr_t)"New department";
              Flds->Update();

              // Update the changed properties.
              pDsrc->Save();


              // Clear the objects.
              pDsrc = NULL;
              pPerson = NULL;

            }
             else if (wcsicmp(strContentClass, (_bstr_t)"urn:content-classes:appointment") == 0)
            {
                             IAppointmentPtr pAppt(__uuidof(Appointment));
              IDataSourcePtr pDsrc;

              hr = pAppt->get_DataSource(&pDsrc);

              hr = pDsrc->Open( (_bstr_t)strObjectUrl,
                                 NULL,
                        adModeReadWrite,
                        adFailIfNotExists,
                        adOpenSource,
                        bstr_t(),  bstr_t());

              // Change some properties.
              pAppt->Subject = (_bstr_t)"New Subject";
              pAppt->Location = (_bstr_t)"New Location";
              pDsrc->Save();

              // Clean up.
              pDsrc = NULL;
              pAppt = NULL;
 
            }
             else 
            {
              printf("Else case = %s\n", (char *)strContentClass); 
            }
         }
  

         Rst->MoveNext();
      }

      // Close connections.
      Rst->Close();
      conn->Close();

      // Clean up.
      Rst = NULL;
          conn = NULL;


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

// GetDomainName 
// 
// Params: [out] BSTR * bstrDomainName 
// Output: HRESULT 
// Purpose: Retrieve the domain DNS name. 

HRESULT GetDomainName(BSTR * bstrDomainName) 
{ 
HRESULT hr = S_OK; 
IADsADSystemInfo *pADsys; 
hr = CoCreateInstance(CLSID_ADSystemInfo, 
NULL, 
CLSCTX_INPROC_SERVER, 
IID_IADsADSystemInfo, 
(void**)&pADsys); 
hr = pADsys->get_DomainDNSName(bstrDomainName); 

if (pADsys) 
pADsys->Release(); 
return hr; 
} 

Send us your feedback about the Microsoft Exchange Server 2003 SDK.

Build: June 2007 (2007.618.1)

© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.