Solved

DLL not allowing calling program to exit

Posted on 2001-06-13
6
203 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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 20

Accepted Solution

by:
Madshi earned 100 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: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

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

Suggested Solutions

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…

829 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