Redemption+CBuilder: RDOSession.Logon MAPILogonEx-Error

T

tsahling

Hi!

I use Redemption 4.2 with C-Builder 5 via imported typelib.

I have the problem that a second usage of RDOSession.Logon returns an
EOleSysError with the message "Error in MAPILogonEx:
MAPI_E_NOT_INITIALIZED".

This is the code:

-----
::CoInitializeEx( 0, COINIT_MULTITHREADED );
// --
try
{
auto_ptr<TOutlookApplication> outlook( new TOutlookApplication( 0 )
);
// --
outlook->ConnectKind = ckNewInstance;
outlook->Connect();
// --
try
{
Variant draftMailEntryID;
// --
{
auto_ptr<TRDOSession> rdoSession( new TRDOSession( outlook.get()
) );
// --
rdoSession->Logon( "", "", false, true );
// --
try
{
Redemption_tlb::IRDOFolderPtr rdoDraftsFolder =
rdoSession->GetDefaultFolder( Outlook_tlb::blush:lFolderDrafts );
Redemption_tlb::IRDOMailPtr rdoMail =
rdoDraftsFolder->Items->Add( Outlook_tlb::blush:lMailItem );
// --
rdoMail->Import( WideString( m_vorlagenDatei ), type );
rdoMail->Subject = WideString( m_dokTitel );
rdoMail->Attachments->Add( m_pdfFilename );
rdoMail->Recipients->Add( m_kunEmail );
// --
rdoMail->Save();
// --
draftMailEntryID = rdoMail->EntryID;
}
__finally
{
rdoSession->Logoff();
}
}
// --
_NameSpacePtr comSession = outlook->GetNamespace( WideString(
"MAPI" ) );
// --
comSession->Logon( "", "", false, true );
// --
try
{
MailItemPtr mail = comSession->GetItemFromID( draftMailEntryID );

// --
mail->Display( true );
// --
mail->Close( olDiscard );
}
__finally
{
comSession->Logoff();
}
}
__finally
{
outlook->Disconnect();
}
}
__finally
{
::CoUninitialize();
}
----

This first time this code is executed, everything is fine. If the user
executes this code a second time, I get the error described above
(line: >rdoSession->Logon( "", "", false, true );<)

I tried already to wrap this code with
MAPIInitialize()/MAPIDeinitialize(), but the same error occurs.

Has anyone an idea what the problem might be?

Thanks!
 
D

Dmitry Streblechenko

Are you sharing the same instance of IRDOSession between different threads?
What is TRDOSession? Is that your class?

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
 
T

tsahling

Are you sharing the same instance of IRDOSession between different threads?

No, the routine is executed once at a time.

But because of your question I had an idea and tried CoInitializeEx
with parameter COINIT_APARTMENTTHREADED. Now I don't get the exception
and everything works fine!
What is TRDOSession? Is that your class?

That's a class generated by C-Builder from the Redemption type lib. It
inherits TOleServer and provides instant access to the interface object
behind it (and its events).

Thanks for your quick reply!
 
Top