Microsoft KB Archive/173550

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Article ID: 173550

Article Last Modified on 8/24/2005



APPLIES TO

  • Microsoft Collaboration Data Objects 1.1
  • Microsoft Collaboration Data Objects 1.2
  • Microsoft Collaboration Data Objects 1.21



This article was previously published under Q173550

SUMMARY

This article covers these three primary ways to create and then logon to a CDO (1.1, 1.2, 1.21) Session from Visual C++:

  • With prompt for Profile
  • Without prompt for Profile
  • Creating a dynamic Profile programmatically


MORE INFORMATION

With Prompt for Profile

    /**********************************************************/ 
    // W_PROMPT.CPP
    // ------------
    // This program demonstrates how to use the Session->Logon
    // of the CDO (1.1, 1.2, 1.21) Library via VC++, to prompt
    // the user for a Profile at Logon.  This sample requires
    // VC++ version 5.0 or higher.
    /**********************************************************/ 

    // To the Developer:
    // There are a couple of sections of this code with action items marked
    // "TO DO:" for you to resolve before it will successfully run. 

    // TO DO: Uncomment the appropriate statement 
    //   and provide the full path to the dll.
    // If you are using CDO (1.1) uncomment the next line:
    // #import <olemsg32.dll> no_namespace
    // If you are using CDO (1.2, 1.21) uncomment the next line:
    // #import "c:\\program files\\common files\\system\\mapi\\1033\\cdo.dll

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

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

    // If this is placed in the scope of the smart pointers, they must be
    // explicitly Release(d) before CoUninitialize() is called.  If any
    // reference count is non-zero, a protection fault will occur.
    struct StartOle {
      StartOle() { CoInitialize(NULL); }
      ~StartOle() { CoUninitialize(); }
    } _inst_StartOle;

    void main()
    {
    try
      {
          // TO DO:
          // Create a MAPI.Session pointer
          // For CDO (1.1) uncomment the next line
          // SessionPtr pSession("MAPI.Session");
          // For CDO (1.2, 1.21) uncomment the next line
          // _SessionPtr pSession("MAPI.Session");

          // Logon prompting the user for a profile
          pSession->Logon(vtMissing, vtMissing, true);

          // The remaining functionality of your app takes place here

          // Logoff of the MAPI Session
          pSession->Logoff();
      }
      catch (_com_error &e)
      {
          dump_com_error(e);
      }
    }
                

Without Prompt for Profile

    /**********************************************************/ 
    // WO_PROMPT.CPP
    // -------------
    // This program demonstrates how to use the Session->Logon
    // of the CDO (1.1, 1.2, 1.21) Library via VC++, to not
    // prompt the user for a Profile at Logon.  This sample
    // requires VC++ version 5.0 or higher.
    /**********************************************************/ 

    // To the Developer:
    // There are a couple of sections of this code with action items marked
    // "TO DO:" for you to resolve before it will successfully run. 

    // TO DO: Uncomment the appropriate statement 
    //   and provide the full path to the dll.
    // If you are using CDO (1.1) uncomment the next line:
    // #import <olemsg32.dll> no_namespace
    // If you are using CDO (1.2, 1.21) uncomment the next line:
    // #import "c:\\program files\\common files\\system\\mapi\\1033\\cdo.dll

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

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

    // If this is placed in the scope of the smart pointers, they must be
    // explicitly Release(d) before CoUninitialize() is called.  If any
    // reference count is non-zero, a protection fault will occur.
    struct StartOle {
      StartOle() { CoInitialize(NULL); }
      ~StartOle() { CoUninitialize(); }
    } _inst_StartOle;

    void main()
    {
    try
      {
          // TO DO:
          // Create a MAPI.Session pointer
          // For CDO (1.1) uncomment the next line
          // SessionPtr pSession("MAPI.Session");
          // For CDO (1.2, 1.21) uncomment the next line
          // _SessionPtr pSession("MAPI.Session");

          // Logon using the specified profile
          pSession->Logon("YourValidProfileNameGoesHere");

          // The remaining functionality of your app takes place here

          // Logoff of the MAPI Session
          pSession->Logoff();
      }
      catch (_com_error &e)
      {
          dump_com_error(e);
      }
    }
                

Creating a Dynamic Profile Programmatically

    /**********************************************************/ 
    // DYN_PROF.CPP
    // ------------
    // This program demonstrates how to use the Session->Logon
    // of the CDO (1.1, 1.2, 1.21) Library via VC++, to create
    // a dynamic Profile at Logon. This is the likely method to
    // use if the application will be run as a Windows NT Service.
    // 
    // The key point of this sample is the final parameter to the
    // logon, which allows for creation of a temporary profile
    // for the session. The CDO (1.1, 1.2, 1.21) Library will
    // generate a random name for the profile.
    // 
    // For an authenticated profile, the format of the string is:
    // 
    //   <server name> + \n + <mailbox name>
    // 
    // where the server and mailbox names can be unresolved. Note
    // that the mailbox name is not the messaging user's display
    // name, but rather the alias or account name used internally
    // by the user's organization. For example, "johnd" should be
    // used instead of "John Doe".
    // 
    // For an anonymous profile, the format is:
    // 
    //   <server distinguished name> + \n\n + "anon"
    // 
    // where the distinguished name of the server takes the form:
    // 
    //   /o=<enterprise>/ou=<site>/cn=Configuration/cn=Servers/cn=<server>
    // 
    // 
    // This sample demonstrates an authenticated logon, and
    // requires Visual C++ version 5.0 or higher.
    /**********************************************************/ 

    // To the Developer:
    // There are a couple of sections of this code with action items marked
    // "TO DO:" for you to resolve before it will successfully run. 

    // TO DO: Uncomment the appropriate statement 
    //   and provide the full path to the dll.
    // If you are using CDO (1.1) uncomment the next line:
    // #import <olemsg32.dll> no_namespace
    // If you are using CDO (1.2, 1.21) uncomment the next line:
    // #import "c:\\program files\\common files\\system\\mapi\\1033\\cdo.dll

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

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

    // If this is placed in the scope of the smart pointers, they must be
    // explicitly Release(d) before CoUninitialize() is called.  If any
    // reference count is non-zero, a protection fault will occur.
    struct StartOle {
      StartOle() { CoInitialize(NULL); }
      ~StartOle() { CoUninitialize(); }
    } _inst_StartOle;

    void main()
    {
    try
      {
          // TO DO:
          // Create a MAPI.Session pointer
          // For CDO (1.1) uncomment the next line
          // SessionPtr pSession("MAPI.Session");
          // For CDO (1.2, 1.21) uncomment the next line
          // _SessionPtr pSession("MAPI.Session");

          // Create the params used in the Logon including the
          // string used for the ProfileInfo
          VARIANTARG vBoolF;
          vBoolF.vt = VT_BOOL;
          vBoolF.boolVal = FALSE;
          VARIANTARG vBoolT;
          vBoolT.vt = VT_BOOL;
          vBoolT.boolVal = TRUE;

          char * pstrProfileInfo ;

          //Modify malloc param to size needed by your app
          pstrProfileInfo = (char *) malloc (27) ;
          strcpy (pstrProfileInfo, "MyServerName\nMyMailBoxName") ;

          // Logon using the specified profile
          // params: profileName, profilePassword, showDialog,
          //         newSession, parentWindow, NoMail, ProfileInfo
          pSession->Logon("",
                          "",
                          vBoolF,
                          vBoolT,
                          vBoolF,
                          vBoolF,
                          pstrProfileInfo);

          // Display generated ProfileName to prove the we are logged on
          MessageBoxW(NULL,pSession->Name.bstrVal,L"",MB_OK) ;

          // The remaining functionality of your app takes place here

          // Logoff of the MAPI Session
          pSession->Logoff();
      }
      catch (_com_error &e)
      {
          dump_com_error(e);
      }
    }
                

REFERENCES

For information on obtaining the CDO (1.x) Library, please see the following article in the Microsoft Knowledge Base:

171440 INFO: Where to Acquire the CDO (1.x) Libraries


Keywords: kbhowto kbmsg kbcode KB173550