[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

DLL not allowing calling program to exit

Posted on 2001-06-13
6
Medium Priority
?
216 Views
Last Modified: 2010-04-06
Ladies & Gentlemen -

Here is my problem.  I have just ventured into DLL creation and I am having issues with the stinking things.

I created a DLL to send email to one or more recipients.  After a bunch of bashing around, I got it to actually send the email.... but after it does that and I exit the calling program, the calling program sits im memory wasting space.

I am including the source code for the dll and the calling program.



here's the DLL
-----------------------------------------------------------
library emailit;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  Sharemem,
  SysUtils,
  Classes,
  windows,
  dialogs,
  comobj, activex;

const
  // for email capability
  olFolderDeletedItems = $00000003;
  olFolderOutbox = $00000004;
  olFolderSentMail = $00000005;
  olFolderInbox = $00000006;
  olFolderCalendar = $00000009;
  olFolderContacts = $0000000A;
  olFolderJournal = $0000000B;
  olFolderNotes = $0000000C;
  olFolderTasks = $0000000D;
  olMailItem = 0;

var
  outlook, nmspace, mailitem: olevariant;

{$R *.RES}

procedure email(sendto, subject: string; body: tstrings);
var str1, str2, str3 : string;
    pos1 : integer;

begin


  if coinitialize(nil) >= 0  then
  try
    outlook := getactiveoleobject('outlook.application');
  except
    outlook := createoleobject('outlook.application');
  end
  else
    exit;
  nmspace := outlook.getnamespace('MAPI');
  nmspace.logon(emptyparam, emptyparam, false, true);
  mailitem := outlook.createitem(olmailitem);
  {more than one recipient in this field will be parsed into individual recipients and added seperately through this routine}
  pos1 := pos(';',sendto);
  if pos1 = 0 then
    mailitem.recipients.add(sendto)
  else
    begin
      str3 := sendto;
      repeat
        str1 := copy(str3,1,pos1-1);
        str2 := copy(str3,pos1+1,(length(str3)-length(str1)));
        mailitem.recipients.add(str1);

        str3 := str2;
        pos1 := pos(';',str3);
      until pos1 = 0;
      mailitem.recipients.add(str3);
    end;
  mailitem.subject := subject;
  mailitem.body := body.text;
  mailitem.send;
 
  nmspace.logoff;
 
  outlook := unassigned;
end;


exports
  email;

begin
end.
------------------------------------------------------------------

The calling program is just a blank form with a button on it which sends an email

calling app's project file :
------------------------------------------------------------------
program emaildlltest;

uses
  ShareMem,
  Forms,
  dlltest in 'dlltest.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
-------------------------------------------------------------------


Calling Program's form
------------------------------------------------------------------
object Form1: TForm1
  Left = 192
  Top = 123
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 76
    Top = 92
    Width = 75
    Height = 25
    Caption = 'Test Email'
    TabOrder = 0
    OnClick = Button1Click
  end
end
---------------------------------------------------------------------

Calling Program's code
---------------------------------------------------------------------
unit dlltest;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure email(sendto,subject: string; body: tstrings);


var
  Form1: TForm1;
var emailto, emailsubject : string;
    emailbody : tstrings;
implementation

{$R *.DFM}

procedure email ;
 external 'EMAILIT.DLL' name 'email';


procedure TForm1.Button1Click(Sender: TObject);

begin
  emailbody := tstringlist.Create;
  emailto := 'somebody@somehost.com'; {change this to suit your purposes}
  emailsubject := 'Testing email DLL';
  emailbody.add('Testing dll emailer');
  email(emailto,emailsubject,emailbody);
  emailbody.free;
end;

end.
-----------------------------------------------------------------

if anyone can tell my why this thing keeps screwing up and not releasing the exe from memory, I would be greatly appreciative.

Thanks in advance
0
Comment
Question by:Phoenix_s
6 Comments
 
LVL 13

Expert Comment

by:Epsylon
ID: 6188203
Maybe you have to call CoUninitialize....
0
 
LVL 1

Author Comment

by:Phoenix_s
ID: 6188324
Epsylon:

I tried that and it made the DLL crap out rather drastically ;)
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 6188909
Try compiling the .EXE and the .DLL with packages enabled.

Cheers,

Raymond.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 20

Accepted Solution

by:
Madshi earned 400 total points
ID: 6189662
Have you tried setting all the ole variants to unassigned, maybe followed by CoUninitialize?

Anyway, it seems your dll doesn't get uninitialized correctly, so I would try working on that issue...

Regards, Madshi.
0
 
LVL 1

Author Comment

by:Phoenix_s
ID: 6192505
Madshi:  setting the olevariants to unassigned made the hanging up problem go away.

Great!  Thanks!
0
 
LVL 1

Author Comment

by:Phoenix_s
ID: 6192506
Madshi:  setting the olevariants to unassigned made the hanging up problem go away.

Great!  Thanks!
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

Question has a verified solution.

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

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
this video summaries big data hadoop online training demo (http://onlineitguru.com/big-data-hadoop-online-training-placement.html) , and covers basics in big data hadoop .
Please read the paragraph below before following the instructions in the video — there are important caveats in the paragraph that I did not mention in the video. If your PaperPort 12 or PaperPort 14 is failing to start, or crashing, or hanging, …
Suggested Courses
Course of the Month19 days, 21 hours left to enroll

872 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