?
Solved

CDO using Borland C++ Builder 5

Posted on 2003-02-19
12
Medium Priority
?
2,362 Views
Last Modified: 2013-12-03
I'm trying to write a simple routine to send emails using CDO and Borland C++ Builder 5 on a Win2k machine.

The MSDN Example listed below (listing1) doesn't work with  BCB. It sometimes gets and internal compiler error and finds duplicate declarations. The BCB help says that using the #import is not a recommended method and that I should use the "Import type library" menu option instead. I tried that approach also and what I have now is listing 2:
It compiles and runs Ok, but nothing is sent or received. If I use :

fld = Flds->get_Item(cdoURLProxyServer);
fld->set_Value(TVariantInParam("Server:8080"));
fld->Release();

instead of :

Flds->get_Item(cdoURLProxyServer)->set_Value(TVariantInParam("Server:8080"));
fld->Release();

then I get and AV on the fld->set_Value line.

There's to be no Flds->Update() method.

and the Stm->SaveToFile(... line also causes and AV.

Any help would be appreciated.



Listing 1: MSDN Example;
========================
#import "d:\program files\common files\system\ado\msado15.dll" no_namespace
#import <cdosys.dll> no_namespace
#include <iostream.h>

void main()
{
  CoInitialize();
  {
    IMessagePtr   iMsg(__uuidof(Message));
    IBodyPartPtr  iBp;
    IBodyPartsPtr iBps;
    _StreamPtr    Stm;
    _bstr_t       filepath;

    IConfigurationPtr iConf(__uuidof(Configuration));
    FieldsPtr         Flds;
    Flds         =    iConf->Fields;
    Flds->Item[cdoSendUsingMethod]->Value       =
          _variant_t(cdoSendUsingPort);
    Flds->Item[cdoSMTPServerName]->Value        =
          _variant_t("somehost@microsoft.com");
    Flds->Item[cdoSMTPConnectionTimeout]->Value = _variant_t((long)10);
    Flds->Item[cdoSMTPAuthenticate]->Value      = _variant_t(cdoBasic);
    Flds->Item[cdoSendUserName]->Value          = _variant_t("username");
    Flds->Item[cdoSendPassword]->Value          = _variant_t("password");
    Flds->Item[cdoURLProxyServer]->Value        = _variant_t("server:80");
    Flds->Item[cdoURLProxyBypass]->Value        = _variant_t("<local>");
    Flds->Item[cdoURLGetLatestVersion]->Value   =
          _variant_t(VARIANT_TRUE);
    Flds->Update();

    iMsg->To        = "\"SomeOne\" <someone@fake.microsoft.com>";
    iMsg->From      = "\"Another\" <another@fake.microsoft.com>";
    iMsg->Subject   = "Here is a subject for the message.";

    /*
    ** attach an html file to message
    ** your local path goes in the "path"
    ** variable below
    */
    try
    {
      filepath  = _bstr_t(path) + _bstr_t("\\htmlfile.html");
      iMsg->AddAttachment(filepath,"","");
    }
    catch (_com_error e)
    {
      //...
    }

    /*
    ** Attach Word 2000 file to message
    */
    try {
      filepath  = _bstr_t(path) + _bstr_t("\\wordfile.doc");
      iMsg->AddAttachment(filepath,"","");
    }
    catch (_com_error e)
    {
      //...
    }
   
    /*
    ** Create MTHML body.
    */
    try
    {
      iMsg->CreateMHTMLBody(
                  "http://mypage",
                  cdoSuppressAll,
                  "",
                  "");
    }
    catch (_com_error e)
    {
      //...
    }

    iMsg->Send();

    // save message
    Stm    = iMsg->GetStream();
    Stm->SaveToFile(_bstr_t("message.eml"),adSaveCreateOverWrite);

  }
  CoUninitialize();
}

Listing 2:
============
#pragma hdrstop
#include <cdo_tlb.h>
#include <cdosysstr.h>
#include "cdosys_i.c"

extern "C" int TestMessage()
{
      TCOMIMessage        iMsg;
      TCOMIConfiguration iConf;
      IBodyPart         *iBp;
      IBodyParts            *iBps;
      _Stream               *Stm;
      int rcode;
      HRESULT hr;
      TInitOle                  tInit;

      /*
      ** Create an instance of the Message and configuration COM class.
      */
      iMsg = CoMessage::Create();
      iConf = CoConfiguration::Create();

      Fields                *Flds;
      Flds = iConf->get_Fields();
      Field *fld;
      fld = Flds->get_Item(cdoSendUsingMethod);
      fld->set_Value(TVariantInParam((short)cdoSendUsingPort));
      fld->Release();
      fld = Flds->get_Item(cdoSMTPServer);
      fld->set_Value(TVariantInParam("192.168.0.1"));
      fld->Release();
      fld = Flds->get_Item(cdoSMTPServerPort);
      fld->set_Value(TVariantInParam((long)25));
      fld->Release();
      fld = Flds->get_Item(cdoSMTPConnectionTimeout);
      fld->set_Value(TVariantInParam((long)10));
      fld->Release();
      Flds->get_Item(cdoSMTPAuthenticate)->set_Value(TVariantInParam(cdoBasic));
//      fld->Release();
      fld = Flds->get_Item(cdoSendUserName);
      fld->set_Value(TVariantInParam("softlif2"));
      fld->Release();
      fld = Flds->get_Item(cdoSendPassword);
      fld->set_Value(TVariantInParam("j3raboam"));
      fld->Release();
      Flds->get_Item(cdoURLProxyServer)->set_Value(TVariantInParam("Stan:3128"));
//      fld->Release();
      Flds->get_Item(cdoURLProxyBypass)->set_Value(TVariantInParam("<local>"));
//      fld->Release();
      Flds->get_Item(cdoURLGetLatestVersion)->set_Value(TVariantInParam(VARIANT_TRUE));
//      fld->Release();
//      Flds->Update();
      Flds->Release();

      iMsg->set_Configuration(iConf);
      wchar_t from[] = L"\"Someone\" <someone@somewhere.co.nz>";
      iMsg->set_To(from);
      iMsg->set_From(L"\"Another\" <someone@somewhere.co.nz>");
      iMsg->set_Subject(L"Here is a subject for the message.");

      /*
      ** attach an html file to message
      ** your local path goes in the "path"
      ** variable below
      */
      if (iMsg->Send() != S_OK)
            rcode = R_ERROR;


      // save message
      Stm    = iMsg->GetStream();
      Stm->SaveToFile(L"e:\\temp\\message.eml",adSaveCreateOverWrite);
      Stm->Release();
      iMsg->Release();
      iConf->Release();
      return(rcode);
0
Comment
Question by:dchell
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 5
12 Comments
 
LVL 49

Expert Comment

by:DanRollins
ID: 7990305
You might be able to avoid compiler errors in listing #1 by using this technique:

Compile once.  The #import will generate a .H files like,

    d:\myproj\test\debug\cdosys.tlh
and
    d:\myproj\test\debug\msado15.tlh
   
At that point, comment out the #import lines and add these lines:

#include "d:\myproj\test\debug\cdosys.tlh"
#include "d:\myproj\test\debug\msado15.tlh"

But you should also check into the files that you are #import-ing.  DO a full-disk search for msado15.dll and cdosys.dll and make sure that you are importing the right files.  You must import the same dll that will be loaded when you instantiate the object and if there are two or more copies of the a DLL then that becomes a bit iffy.

-- Dan
0
 

Author Comment

by:dchell
ID: 8004020
Thanks, That's solved the Internal Compiler error problems, now I  get:

MSADO15.LH(844) Unrecognized __declspec modifier
MSADO15.TLH(844) Declaration does not specifiy a tag or an identifier
MSADO15.TLH(840) 'GetRow' is not a member of 'ADORecordConstruction'
0
 

Author Comment

by:dchell
ID: 8004106
Don't panic, I've fixed that one - the following line was missing two close brackets/
0
Veeam Task Manager for Hyper-V

Task Manager for Hyper-V provides critical information that allows you to monitor Hyper-V performance by displaying real-time views of CPU and memory at the individual VM-level, so you can quickly identify which VMs are using host resources.

 
LVL 49

Expert Comment

by:DanRollins
ID: 8004461
Which line was that?  I have no problem compiling that file with VC++
-- Dan
0
 

Author Comment

by:dchell
ID: 8004744
Now it compiles fine but I have the following 3 unresolved externals at link time:
__stdcall_com_issue_error(long)
_com_dispatch_method(IDispatch *, long, unsigned short, unsigned short, void *, const wchar_t *, ...)
_stdcall_com_util::ConvertStringToBSTR(const char *)

MSDN says that _com_dispatch_method is an undocumented runtime library function. It's obviously not in BCB's runtime library - I've searched all files on my disk for _com_dispatch_method - nothing.

0
 
LVL 49

Expert Comment

by:DanRollins
ID: 8005276
According to the MSDN article:
PRB: Use IDispatch for Objects Created by a DataSpace Object
it should be easy to create a replacement for that function.  I don't have the code.

Do you have a file named COMSUPP.LIB ? that seems to provide the code for a number of these utility fns.

-- Dan
0
 

Author Comment

by:dchell
ID: 8005611
I didn't have a comsupp.lib, so I hunted around and found one - but BCB doesn't like the format of it. I get a linker error: COMSUPP.LIB contains and invalid OMF record, type 0x21 (possible COFF).

The problem is that there's 111 calls to _com_dispatch_method in the automatically generated cdosys.tli file and then there's _stdcall_com_issue_error and ConvertStringToBSTR to replace.
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 8006008
If you can get the comsupp.dll, you can use the borland tools to generate a .LIB file for it.

-- Dan
0
 

Author Comment

by:dchell
ID: 8006071
Yep, I'd thought of that too, but it's not an import library - it's part of the VC static runtime library.
0
 
LVL 49

Accepted Solution

by:
DanRollins earned 2000 total points
ID: 8011529
You might be better off using a different system for sending emails.  There are many available that are totally compiler agnostic.  Have you rejected that idea?

-- Dan
0
 

Author Comment

by:dchell
ID: 8011765
Well I started off using MAPI and Extended MAPI but I have a problem with the MAPI Spooler hanging - see http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_20513569.html

In my travels through MSDN I spotted CDO as a possibility and thought I'd give it a try.

I do have another option - and that is to install Visual Studio (I have it on CD) and compile just the CDO module with that - but I'm a bit short of disk space (need to clean out some games). It's not a favoured option as it makes debugging somewhat tiresome. I've also left a message on the Borland newsgroups and am waiting for a response.
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

For most people, the WrapPanel seems like a magic when they switch from WinForms to WPF. Most of us will think that the code that is used to write a control like that would be difficult. However, most of the work is done by the WPF engine, and the W…
A theme is a collection of property settings that allow you to define the look of pages and controls, and then apply the look consistently across pages in an application. Themes can be made up of a set of elements: skins, style sheets, images, and o…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question