AGB  ·  Datenschutz  ·  Impressum  







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

Application in DLL auslagern

Ein Thema von BerndS · begonnen am 15. Mär 2022 · letzter Beitrag vom 18. Mär 2022
Antwort Antwort
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#1

Application in DLL auslagern

  Alt 15. Mär 2022, 21:18
Den gesamten Vcl Teil eines Programms habe ich in eine DLL ausgelagert. Das nutzt zum Start die Prozedur Run,die sich z.B. per Rundll32.exe starten lässt.
Der Sinn dahinter ist, das andere Programme einige Funktionen nutzen können und die eigentliche Exe,die die DLL lädt mit verschiedenen Versionen der DLL umgehen kann. So kann man ein temporäres Update einspielen ohne andere Nutzer das Programm beenden müssen.

Leider wird mit aktivierter Prüfung Speicherplatzfreigabe immer angezeigt, dass 12 Bytes nicht freigegeben wurden. Das war schon bei XE7 so und auch mit 11.1 ist das noch so.

Heute habe ich mir mal die Zeit genommen, die Ursache zu finden.
Letztendlich liegt der Fehler in der Methode TApplication.Run
Hier wird am Anfang ein AddExitProc aufgerufen. Bei DLLS werden diese aber nie ausgeführt und somit auch der Speicher der verketteten Liste nicht freigegeben.
Ein
Delphi-Quellcode:
...
if not IsLibrary then
  AddExitProc(...);
...
behebt das Problem.
Die 12 Bytes sind an sich nicht das Problem, aber man muss immer beim beenden die Meldung bestätigen und das hat mich schon lange gestört.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#2

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 11:31
Ich habe dazu mal eine Bugreport erstellt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 14:35
Dafür gibt es auch die Möglichkeit erwartete Speicherlecks, sprich solche, die man kennt, aber nicht selbst beheben kann oder möchte, zu registrieren. Diese werden dann beim Beenden ignoriert.
https://docwiki.embarcadero.com/Libr...ctedMemoryLeak
Das geht natürlich nur, wenn man an die passende Speicheradresse heran kommt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#4

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 15:05
@jaenicke
Danke für den Tip.
In meinem Fall ist das ExitProcList aus der System.Sysutils.
Da kommt man leider nicht ran da unter implementation deklariert.

Um die Meldung zu vermeiden werde ich mit einer minimal geänderten Vcl.Forms arbeiten müssen.
Möglicherweise wird das ja irgendwan gefixt.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 15:21
.. Um die Meldung zu vermeiden werde ich mit einer minimal geänderten Vcl.Forms arbeiten...
Wie sieht Dein modifizitertes Vcl.Form aus?
Danke & Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#6

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 15:32
Delphi-Quellcode:
procedure TApplication.Run;
begin
  FRunning := True;
  try
{$IF NOT DEFINED(CLR)}
    if not IsLibrary then // <- nur diese Zeile hinzufügen
      AddExitProc(DoneApplication);
{$ENDIF}
...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 16:38
So kann man ein temporäres Update einspielen ohne andere Nutzer das Programm beenden müssen.
Wie darf man das verstehen? Könntest Du es bitte erklären auch wenn es nicht direkt zum Thread passt. Danke!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#8

AW: Application in DLL auslagern

  Alt 16. Mär 2022, 17:41
Das Programm läuft auf einem Terminalserver in der Cloud. Dadurch das es den ganzen Tag von vielen Benutzern gestartet ist, kann ich es nicht so einfach austauschen.
Gestartet wird eine kleine Exe, dass die Main.DLL mit den Hauptprogramm lädt.

Wenn ich es temporär austauschen möchte, kopiere ich die neue Version als Main_1234.dll in das Programmverzeichnis. 1234 steht für die Buildnummer der DLL.
Wird die Exe erneut gestartet, prüft die Exe vor dem Laden der Main.dll ob nicht eine neuere DLL vorhanden ist. Falls ja, wird die mit der höchsten Nummer verwendet.
Dadurch arbeiten alle Benutzer, die das Programm neu starten dann automatisch mit der neusten Version.

Nachts, wenn keiner Online ist, werden alle Main_????.dll gelöscht und die Main.dll falls nötig über ein Script aktualisiert.
  Mit Zitat antworten Zitat
arnold mueller

Registriert seit: 27. Jul 2005
129 Beiträge
 
#9

AW: Application in DLL auslagern

  Alt 18. Mär 2022, 20:34
Das Programm läuft auf einem Terminalserver in der Cloud. Dadurch das es den ganzen Tag von vielen Benutzern gestartet ist, kann ich es nicht so einfach austauschen.
Gestartet wird eine kleine Exe, dass die Main.DLL mit den Hauptprogramm lädt.

Wenn ich es temporär austauschen möchte, kopiere ich die neue Version als Main_1234.dll in das Programmverzeichnis. 1234 steht für die Buildnummer der DLL.
Wird die Exe erneut gestartet, prüft die Exe vor dem Laden der Main.dll ob nicht eine neuere DLL vorhanden ist. Falls ja, wird die mit der höchsten Nummer verwendet.
Dadurch arbeiten alle Benutzer, die das Programm neu starten dann automatisch mit der neusten Version.

Nachts, wenn keiner Online ist, werden alle Main_????.dll gelöscht und die Main.dll falls nötig über ein Script aktualisiert.


Wäre es nicht einfacher denselben Mechanismus mit EXE Dateien umzusetzen? -> Die kleine Exe startet eine andere Exe und prüft vorher, ob es eine neuere Version gibt und startet ggf. diese und so weiter ...
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#10

AW: Application in DLL auslagern

  Alt 18. Mär 2022, 21:33
Das es mir bisher nicht gelungen ist eine exe als DLL in eine andere exe zu laden, muss ich eine DLL benutzen. Die DLL wird einmal als Programm und ein weiteres mal als dll für bestimmte Funktionen von Fremdprogrammen verwendet. Dafür gibt es sicherlich auch andere Wege, aber die Umstellung wäre für beide Seiten neue Entwicklungszeit.
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:45 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