AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Aufruf aus EXE

Ein Thema von Ruewue · begonnen am 6. Nov 2009 · letzter Beitrag vom 6. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Ruewue

Registriert seit: 16. Okt 2006
27 Beiträge
 
#1

DLL Aufruf aus EXE

  Alt 6. Nov 2009, 09:59
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:12
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#3

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:13
Etwas mehr Info wäre nicht schlecht. Wie sieht die exportierte Funktion in der DLL aus, die das Formular aufruft?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ruewue

Registriert seit: 16. Okt 2006
27 Beiträge
 
#4

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#5

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:36
Und die Implementation von ShowFormAdministration im DLL-Code? Und wie himitsu schon fragte, werden zwischen DLL und Exe wechselseitig auf VCL-Komponenten zugegriffen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:42
Hi,

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

Gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Ruewue

Registriert seit: 16. Okt 2006
27 Beiträge
 
#7

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:53
Hi,

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

z.B. CloseAction:=caFree

Gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 10:55
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Ruewue

Registriert seit: 16. Okt 2006
27 Beiträge
 
#10

Re: DLL Aufruf aus EXE

  Alt 6. Nov 2009, 11:03
@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
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