Delphi-PRAXiS

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.

MarcoWarm 6. Nov 2009 10:06

Re: DLL Aufruf aus EXE
 
Zitat:

Zitat von Elvis
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.

Räusper... Also Widestrings sind IMO genauso "Delphi-Features" und werden vom MemoryManager verwaltet.
Für die Kommunikation zwischen DLL und Application sollten immer nur Pointer auf Strings (egal ob PWideChar oder PAnsiChar) genutzt werden. Wenn es garnicht anders geht auch ShortStrings (z.B. String[60]).

Gruß
Marco

MarcoWarm 6. Nov 2009 10:08

Re: DLL Aufruf aus EXE
 
Zitat:

Zitat von Ruewue
@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.

das ist ein absolutes NONO... du musst!!! sicherstellen, daß die Anwendung über die Lebenszeit der DLL hinaus "am leben" bleibt. Im Zweifelsfall gibst du der DLL ein Close event, damit du die DLL vor der Application schließen kannst.

Gruß
Marco

himitsu 6. Nov 2009 10:19

Re: DLL Aufruf aus EXE
 
bei Statischer Linkung wird die DLL nach der EXE beendet.

Delphi-Quellcode:
ShowFormAdministration(sUser, sEnvironment : String)
hier hattest du im Speichermanager der EXE variablen erstellt und übergeben
die Exe und ihr Speichermanager wird beendet
und danach versicht die Dll in ihrem Speichermanager Variablen freizugeben, welche es da nicht gibt.

> Stichwort: SharedMemoryManager


Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//  FreeAndNil(Sender);
end;
du willst der Form, wärend ihrer Abarbeitung, sich selber unter sich wegziehen lassen? :shock:


Der WideString ist eine Delphi-Umleitung zum OLE-String und der wird von der OleAut32.dll verwaltet und nicht vom DelphiMM (siehe MSDN-Library durchsuchenSysAllocStringLen)

Ruewue 6. Nov 2009 10:33

Re: DLL Aufruf aus EXE
 
D A N K E !!!

Hat mir sehr weiter geholfen.

MarcoWarm 6. Nov 2009 10:52

Re: DLL Aufruf aus EXE
 
Zitat:

Zitat von himitsu
Der WideString ist eine Delphi-Umleitung zum OLE-String und der wird von der OleAut32.dll verwaltet und nicht vom DelphiMM (siehe MSDN-Library durchsuchenSysAllocStringLen)

Danke für die Info


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.

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