PRB: Problems with CoInitializeEx and CDO
ID: Q239096
|
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
Keywords : kbCDO kbDSupport exc55
Version : winnt:5.5
Platform : winnt
Issue type : kbprb