AGB  ·  Datenschutz  ·  Impressum  







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

Thread in DLL richtig freigeben

Ein Thema von Dalai · begonnen am 4. Jun 2022 · letzter Beitrag vom 6. Jun 2022
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 12:30
vielleicht
Bei Google suchenDelphi DllEntryPoint
Bei Google suchenDelphi DllMain

oder das Programm, welches die DLL einbindet, ruft selber eine Init-Prozedur auf. (wie z.B. bei PluginSystem gern gemacht)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#2

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 13:50
@himitsu:
Von DllEntryPoint hab ich ja bereits im OP einen Auszug in Codeform gepostet. Und es geht auch nicht um Init-Funktionen sondern deren Pendant vor dem Entladen der DLL.

@TurboMagic:
Dachte nicht, dass das relevant ist. Meine Ausführungen hatte ich recht allgemein gehalten, weil die Problematik sich ja immer dort stellt, wo DLLs Threads erzeugen und vor deren Entladen wieder freigeben sollen. Anyway, die nun gefundene Funktion heißt FsContentPluginUnloading und stammt vom WFX-Plugin-Interface von Total Commander. Offenbar ruft TC diese Funktion, bevor er mit FreeLibrary ein Plugin entlädt - aber natürlich nur, wenn ein Plugin diese Funktion exportiert.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 14:18
Der DllEntryPoint/DllMain wird beim Laden und Entladen aufgerufen.

Beim Laden hat man es indirekt ... der BEGIN-END-Block in der DPR.
Für's Entladen muß man sich registrieren.

Oder man nimmt eben das, was man in den Units hat.
initialization und finalization
oder eben Class Constructor und Class Destructor


Der EntryPoint der EXE/DLL ist im Pascal "versteckt",
bzw. der ruft von innen aus nacheinander das BEGIN-END der DPR und alle Initialization/Finalization der Units auf.
Zuerst die Class-Constructor, dann Initialization, jeweils für alle Units und zum Schluß den Main-Code in der DPR.
Und beim Entladen genau andersrum. (nur eben normal ohne einen Code in der DPR, außer man überschreibt die MainProc)



Zitat:
FsContentPluginUnloading
Genau, es macht das Programm, welches solche DLLs lädt. (sowas findet man natürlich in der Dokumentation der API)
Vor allem, um beim Laden noch einige Werte zu übergeben, und/oder vorher noch paar Dinge zu initialisieren.

Ist das Gleiche, wie das "Register" im Delphi, für IDE-Plugins.
https://docwiki.embarcadero.com/RADS...nents_aufrufen
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Jun 2022 um 14:28 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.096 Beiträge
 
Delphi 12 Athens
 
#4

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 14:58
Da ich nicht raten mag, hätt' ich gerne vom OP die Info, was ihm jetzt geholfen hat.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#5

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 16:48
Es sollte nun klar sein, was geholfen hat. Der Vollständigkeit halber nochmal: Die Freigabe des Threads erfolgt nun in der zusätzlich implementierten und exportierten Funktion FsContentPluginUnloading statt im DllEntryPoint bei DLL_PROCESS_DETACH. Letzteres ist wirklich der zuletzt aufgerufene Code, und offensichtlich für eine Freigabe von Threads zu spät.

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 17:30
Und nochmal .... ist wirklich ALLES an Code in der DPR drin?
Wenn nicht, warum nimmt man dann nicht einfach finalization, was am Einfachsten ist und sogar mehrmals genutzt werden kann, ohne Andere zu überschreiben.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#7

AW: Thread in DLL richtig freigeben

  Alt 6. Jun 2022, 18:00
Natürlich ist nicht der gesamte Code in der DPR, aber da der Thread ausschließlich dort gebraucht wird, ist der auch dort deklariert. Es war mir nicht auch bewusst, dass der finalization -Abschnitt noch vor dem Abräumen des Rests gerufen wird. Daher kam ich gar nicht auf die Idee, es damit zu versuchen. Daher auch die Eröffnung dieses Threads.

Sollte es mal die Notwendigkeit geben, Threads freizugeben, ohne dass eine dedizierte Funktion gibt, die vor dem Entladen gerufen wird, denke ich hoffentlich an den finalization -Abschnitt.

Was meinst du mit "ohne andere zu überschreiben"?

Grüße
Dalai
  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 23:40 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