Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL Aufruf aus EXE (https://www.delphipraxis.net/142933-dll-aufruf-aus-exe.html)

Ruewue 6. Nov 2009 08:59


DLL Aufruf aus EXE
 
Hallo Zusammen,

ich habe eine etwas spezielle Frage und hofe in diesem Forum richtig zu sein.

Ich habe eine EXE die eine DLL(eine neue Form) aufruft. Funktioniert alles super. Wenn ich die DLL schliese und dann die EXE ist auch alles ok. Schließe ich nun die EXE bei geöffneter DLL, so erhalte ich eine Fehlernmeldung.

Exception EAccessViolation in Mudol TEST.dll bei 00005184.
Zugriffsverletzung bei Adresse 006A5184 in Modul 'TEST.dll'. Lesen von Adrresse 013C0438.


Wenn ich in der EXE beim Beenden

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(Sender);
end;


einbaue, ist die Fehlermeldung weg, aber die EXE wird nur unsichtbar. Sie ist im System als Prozess immer noch vorhanden. Auch die DLL wird nicht geschlossen.

Was muss ich machen, damit mir beim versehentlichen Schließen der EXE auch die DLL geschlossen wird ohne das ein Fehler erscheint.

Danke schon mal für die Hilfe!
Rüdiger

himitsu 6. Nov 2009 09:12

Re: DLL Aufruf aus EXE
 
Die VCL ist über die Modulgrenzen (EXE<>DLL) miteinander verbunden?

Sowas ist bei DLLs nicht möglich.
http://www.delphipraxis.net/internal...ht=exe+dll+vcl
http://www.delphipraxis.net/internal...t.php?t=158838
http://www.delphipraxis.net/internal...t.php?t=167009
uvvm.

DeddyH 6. Nov 2009 09:13

Re: DLL Aufruf aus EXE
 
Etwas mehr Info wäre nicht schlecht. Wie sieht die exportierte Funktion in der DLL aus, die das Formular aufruft?

Ruewue 6. Nov 2009 09:33

Re: DLL Aufruf aus EXE
 
Hallo

meine EXE sieht so aus:

Delphi-Quellcode:
unit TestDLL;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
  function ShowFormAdministration(sUser, sEnvironment : String) : Integer; stdcall; external 'TEST.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowFormAdministration(UpperCase(GetEnvironmentVariable('USERNAME')), 'TEST');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//  FreeAndNil(Sender);
end;

end.
Sieh dient nur zum Testen der DLL.

DeddyH 6. Nov 2009 09:36

Re: DLL Aufruf aus EXE
 
Und die Implementation von ShowFormAdministration im DLL-Code? Und wie himitsu schon fragte, werden zwischen DLL und Exe wechselseitig auf VCL-Komponenten zugegriffen?

MarcoWarm 6. Nov 2009 09:42

Re: DLL Aufruf aus EXE
 
Hi,

ich gehe davon aus, daß es in der Dll irgendein Speicherleck gibt. Zumindest kenne ich solche Fehler von daher.

Gruß
Marco

Ruewue 6. Nov 2009 09:49

Re: DLL Aufruf aus EXE
 
Es werden keine VCL wechselseitig aufgerufen. Die EXE dient nur dem Aufruf der DLL für Testzwecke. Die DLL ist nachher in einem anderen Projekt integriert.

Hier die Function in der DLL:

Delphi-Quellcode:
function ShowFormAdministration(sUser, sEnvironment : String): Integer; stdcall;
var
  Form : TSDIAppForm;

begin
  gsLoginUser  := sUser;
  gsEnvironment := sEnvironment;
  Form         := TSDIAppForm.Create(nil);
  Form.Show;
end;

exports
  ShowFormAdministration ;

begin
end.
Es wird eine Form aufgerufen auf der alle Aktivitäten ablaufen.

MarcoWarm 6. Nov 2009 09:53

Re: DLL Aufruf aus EXE
 
Hi,

da haben wir den Salat. Wird das Formular nach dem Show auch mal wieder freigegeben?

z.B. CloseAction:=caFree

Gruß
Marco

Elvis 6. Nov 2009 09:55

Re: DLL Aufruf aus EXE
 
Du benutzt "String", welcher IMO ziemlicher Blödsinn ist, wenn man DLLs benutzt. Denn Strings sind Delphi-features und dann auch noch verwaltet vom MemoryManager.
Was schnell zu Fiesimatenten führt.
Entweder du nimmst PWideChar, oder WideString, oder du bleibst beim alten ANSI-Krams und nimmst PChar.

Ungeachtet dessen...
Falls du auch nur irgendwo in der DLL die globale Variable deines Forms hernimmst, die Delphi hirnamputierterweise jedesmal anlegt, solltest du dich nicht wundern wenn es irgendwo irgendwann knallt.
Nochmal: Hast du auch nur irgendwo code, der "Form1." enthält, dann ist das schlicht und ergreifend falsch.

So sollte es einfach gehen, solange du in dem Form nix machst was du zufrüh freigibst:
Delphi-Quellcode:
function ShowFormAdministration(const sUser, sEnvironment : WideString) : Integer; stdcall; export;
...
implementation
...
function ShowFormAdministration(const sUser, sEnvironment : WideString) : Integer;
var
  yourForm : TYourForm;
begin
  yourForm := TYourForm.Create(nil);
  try
    yourForm.UserName   := sUser;
    yourForm.Environment := sEnvironment;

    result := yourForm.ShowModal();
  finally
    yourForm.Free();
  end;
end;
Edit:
Auwaia, du zeigst das Form nicht modal, aber ohne etwas an die Echse zu übergeben, mit der es Geschlossen und/oder Freigegeben werden kann?
Marcos Vorschlag mit der CloseAction trifft es schon auf den Kopf.

Ruewue 6. Nov 2009 10:03

Re: DLL Aufruf aus EXE
 
@MarcoWarm: Die Form ist ja noch aktive. Die EXE wurde für Testzwecke geschlossen um die Reaktion zu testen. Dabei trat das Problem auf. Es soll den Fall wiederspiegeln, wenn der User während der Arbeit einfach ein Programm beendet ohne die Form geschlossen zu haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz