Article: Q239096
Product(s): Microsoft Exchange
Version(s): 5.5
Operating System(s): 
Keyword(s): kbCDO kbDSupport exc55
Last Modified: 08-MAY-2002
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Exchange Server, version 5.5 
-------------------------------------------------------------------------------
SYMPTOMS
========
Collaboration Data Objects (CDOs) are not multi-threaded apartment safe. The COM
library has to be initialized as a multi-threaded apartment to make CDO a
multi-threaded apartment. From CDO, the MAPIInitialize function is called, which
in turn calls the CoInitialize(NULL) function. This causes a conflict and the
code fails.
MORE INFORMATION
================
The following sample code fails with error code 0x80040154
(REGDB_E_CLASSNOTREG):
  #define _WIN32_DCOM
  #import <cdo.dll> no_namespace
  #include <stdio.h>
  #include <assert.h>
  #include <tchar.h>
  #include <objbase.h>
  #pragma message ("TO DO: change RECIPIENT_NAME to your emailid")
  #define RECIPIENT_NAME "jack@microsoft.com"
  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()  {
           CoInitializeEx(NULL,COINIT_MULTITHREADED) ;	
      }
      ~StartOle() {
           CoUninitialize();
      }
  } _inst_StartOle;
  void main()
  {
      try {
  	
          SessionPtr pSession("Mapi.Session");
          pSession->Logon("Microsoft Outlook");
          FolderPtr   pFolder = pSession->Outbox;
          MessagesPtr pMessages = pFolder->Messages;
          MessagePtr  pMessage = pMessages->Add();
          pMessage->Subject = "VCCOM: MAPI Example";
           
          RecipientsPtr pRecipients = pMessage->Recipients;
          RecipientPtr pRecipient = pRecipients->Add();
          pRecipient->Name = RECIPIENT_NAME;
          pRecipient->Type = (long) mapiTo;
          pRecipient->Resolve();
          pMessage->Send(false, false);
          pSession->Logoff();
          } 
  catch (_com_error &e) {
          dump_com_error(e);
      }
  }
Workaround
----------
To solve the problem, change the following registry key from Both to Apartment:
  
  HKEY_CLASSES_ROOT\CLSID\{3FA7DEB3-6438-101B-ACC1-00AA00423326}\InprocServer32\ThreadingModel
REFERENCES
==========
For additional information, click the article number below to view the article
in the Microsoft Knowledge Base:
  Q239853 MAPI_NO_COINIT Flag To Make MAPIInitialize Not Call CoInit
Additional query words: CDO CoInitializeEx 0x80040154 multithreaded
======================================================================
Keywords          : kbCDO kbDSupport exc55 
Technology        : kbExchangeSearch kbExchange550 kbZNotKeyword2
Version           : :5.5
Issue type        : kbprb
Solution Type     : kbfix
=============================================================================