![]() |
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 |
Re: DLL Aufruf aus EXE
Die VCL ist über die Modulgrenzen (EXE<>DLL) miteinander verbunden?
Sowas ist bei DLLs nicht möglich. ![]() ![]() ![]() uvvm. |
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?
|
Re: DLL Aufruf aus EXE
Hallo
meine EXE sieht so aus:
Delphi-Quellcode:
Sieh dient nur zum Testen der DLL.
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. |
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?
|
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 |
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:
Es wird eine Form aufgerufen auf der alle Aktivitäten ablaufen.
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. |
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 |
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:
Edit:
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; 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. |
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 02:32 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