[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

DLL not allowing calling program to exit

Posted on 2001-06-13
6
Medium Priority
?
213 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
[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 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

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering 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

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
Suggested Courses

649 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