Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Handle Count erhöht sich (https://www.delphipraxis.net/205052-handle-count-erhoeht-sich.html)

venice2 28. Jul 2020 17:58

AW: Handle Count erhöht sich
 
Zitat:

Es könnte ja sein... und dann wäre das gleiche Handle irgendwie "logisch".
Ja solange es sich immer um die gleiche DLL handelt ist das ja auch kein problem.

Aber ich lade unterschiedliche DLLs also sollte eigentlich das Handle auch unterschiedlich sein.
Abhängig von der jeweiligen DLL egal ob sich diese im Cache befindet oder nicht.

Also wenn die Handles immer gleich sind welche DLL wird denn dann nun entladen?

himitsu 28. Jul 2020 18:34

AW: Handle Count erhöht sich
 
Das "Handle" einer DLL entspricht aktuell "zufällig" der Adresse im RAM (bei Win32 ... 64 weiß ich nicht)
und so lange die DLL immer an der selben Stelle geladen wird, bleibt sie auch dort.

Außerdem, wenn die DLL beim FreeLibrary nicht freigegeben wird, weil z.B. noch ein anderes Handle drauf zeigt (Referenzzählung), dann lädt das nächste LoadLibrary auch nicht neu und bekommt das aktive Handle.

Statt MSDN-Library durchsuchenLoadLibrary vorher einfach mal mit MSDN-Library durchsuchenGetModulHandle nachsehn, ob die schon/noch da ist.

Jede EXE/DLL hat zwar eine LadeAdresse und würde "eigentlich" auch immer an der Stelle geladen, also hätte somit immer die selbe Adresse/Handle bekommen, ABER
* fast Alle Entwickler vergessen die zu setzen, somit steht die Vorgabe immer auf $00400000, was oft belegt ist (wenn mehrere EXE/DLL die Gleiche haben) und somit verschoben wird
** allerdings hat Windows einen Cache und merkt es sich ... um nicht jedesmal neu die Reallocations neu zu berechnen
** dieser Cache sorgt auch dafür, dass mehrere Instanzen der DLL in verschiedenen Programmen bzw. Programminstanzen (Programm mehrmals gestartet) auch "möglichst" die selbe Adresse haben (gemeinsam genutzter Speicher)
http://docwiki.embarcadero.com/RADSt...e-Basisadresse
* und man kann im Windows auch eine Sicherheitfunktion aktivieren, womit EXE und DLLs immer neu zufällig positioniert werden, damit Hacker/Viren/Trojaner mit statischen Zeigern kein "leichtes" Spiel haben, z.B. durch einen billigen Bufferoverflow im Browser

Zitat:

aber ich lade unterschiedliche DLLs also sollte eigentlich das Handle auch unterschiedlich sein.
so lange die Entwickler keinen Mist gebaut haben ... z.B. überall die gleiche ImageBase

venice2 28. Jul 2020 21:24

AW: Handle Count erhöht sich
 
Zitat:

Statt MSDN-Library durchsuchenLoadLibrary vorher einfach mal mit MSDN-Library durchsuchenGetModulHandle nachsehn, ob die schon/noch da ist.
Könnte ich machen wobei ein FreeLibrary letztendlich auch nichts anderes macht.
Entweder die Rückgabe ist true dann existiert die DLL noch oder aber false dann nicht. Oder?

Glaube aber trotzt deiner guten Beschreibung wird es nicht mein Problem lösen.

Zitat:

Außerdem, wenn die DLL beim FreeLibrary nicht freigegeben wird, weil z.B. noch ein anderes Handle drauf zeigt (Referenzzählung)
Wie ich schon sagte ist immer True also kann kein Handle noch auf DLL zeigen.

Ist wohl wieder ein Spezialfall. JA meistens sitzt das Problem davor ist bekannt. ;) Falls so ein Spruch wieder kommt.

himitsu 28. Jul 2020 22:36

AW: Handle Count erhöht sich
 
Nein, das mit dem Result ist ganz einfach (wenn ich die Hilfe richtig gelesen hab :stupid:)

entweder es ist ein gültiges Handle, dann ist es True,
oder es ist ungültig, oder 0 oder -1 (INVALID_HANDLE_VALUE) und dann ist die Funktion nicht erfolgreich, also False.
Gehört das Handle zu einem anderen Prozess und es fehlen somit die Rechte, dann schlägt es auch mit einem gültigen existierendem Handle fehl.

Ob die DLL wirklich entladen wurde, wird damit nicht gesagt.


Stell es dir wie ein Interface vor (_AddRef/_Release):
True = der Referenzzähler wurde erfolgreich dekrementiert (ob er dabei 0 und die DLL entladen wurde, erfährst du nicht)
False = beim Interface würde (hoffentlich) eine Zugriffsverletzung kommen

venice2 28. Jul 2020 22:40

AW: Handle Count erhöht sich
 
Ach so ist das.

Dachte immer es sagt aus ob die DLL entladen wurde oder nicht.
Desto trotz kann ich im Process Explorer erkennen das die DLL vom Prozess gelöst - entladen wurde.

Welchen sinn macht FreeLibrary wenn man damit nicht garantieren kann das die DLL auch entladen wurde.

Ob die DLL entladen wurde prüfe ich jetzt so (ändert aber auch nichts am counter)

Delphi-Quellcode:
  if DllHandle <> 0 then
  begin
    FreeLibrary(DllHandle);
    module := GetModuleHandle(DLLPath);
    if module = 0 then
      DllHandle := 0;
  end;
So kann ich wenigstens prüfen ob diese vom Prozess gelöst wurde.
Der code ist nur ein Beispiel nicht vollständig!

venice2 29. Jul 2020 01:03

AW: Handle Count erhöht sich
 
Ich glaube habe den Fehler gefunden.
Ich erstelle ein Event

Delphi-Quellcode:
    hEventFree := CreateEvent(nil, False, False, nil);
    PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
    try
      repeat
        WaitRe := WaitForSingleObject(hEventFree, 15);
        if WaitRe <> WAIT_OBJECT_0 then
          WinProcessMessages;
      until WaitRe = WAIT_OBJECT_0;
    finally
      CloseHandle(hEventFree); // hat gefehlt
      ThreadId := 0;
    end;
wenn der Thread beendet wird setze ich das Event
Delphi-Quellcode:
SetEvent(hEventFree);


Habe das Event Handle aber nicht freigegeben.
Delphi-Quellcode:
CloseHandle(hEventFree);


jetzt bleibt der Counter constant.
Hoffe das war mein Problem. Oder doch nicht?
Würde mich mal interessieren ob ich richtig liege.

Das man das Event Handle freigeben muss war mir nicht bekannt.
Auch hier im Forum habe ich noch nicht gelesen das es jemand tut.

Frage mich nur warum hat FastMM4 und oder EurekaLog das nicht erkannt.

Dalai 29. Jul 2020 08:19

AW: Handle Count erhöht sich
 
Zitat:

Zitat von venice2 (Beitrag 1470634)
Das man das Event Handle freigeben muss war mir nicht bekannt.

Steht (ganz unten) in den Remarks zur API-Funktion MSDN-Library durchsuchenCreateEvent:
Zitat:

Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The event object is destroyed when its last handle has been closed.

Zitat:

Frage mich nur warum hat FastMM4 und oder EurekaLog das nicht erkannt.
Simpel: Weil sowas nicht von einem Delphi Memory Manager (MM) erfasst wird bzw. werden kann. Gleiches gilt für Icons, die man mit LoadIcon oder LoadImage lädt. Die gehen am Delphi MM vorbei, und daher bekommt der davon nix mit.

Grüße
Dalai

shebang 29. Jul 2020 09:58

AW: Handle Count erhöht sich
 
Hat die Benutzung von
Delphi-Quellcode:
CreateEvent
irgendwelche Vorteile gegenüber
Delphi-Quellcode:
TEvent.Create
?

himitsu 29. Jul 2020 10:54

AW: Handle Count erhöht sich
 
Nein.

TEvent kapselt im Windows auch nur diese API,
mit dem Vorteil, dass es auf anderen Plattformen auch was Vergleichbares nutzt, wo die WinAPI nicht bekannt ist.

Selbes gilt auch für CriticalSections und Dergeleichen, wo es ebenfalls inzwischen im Delphi eine Kapselung gibt (Delphi-Referenz durchsuchenTCriticalSection)
Aber da darf man auch gern Delphi-Referenz durchsuchenTMonitor nehmen (Achtung, das Richtige, weil jemand war auf die geile Idee gekommen diesen Namen zu nehmen, obwohl es in Screens.pas sowas schon seit Jahrzehnten gab)

venice2 29. Jul 2020 16:54

AW: Handle Count erhöht sich
 
Zitat:

Zitat von Dalai (Beitrag 1470646)
Zitat:

Zitat von venice2 (Beitrag 1470634)
Das man das Event Handle freigeben muss war mir nicht bekannt.

Steht (ganz unten) in den Remarks zur API-Funktion MSDN-Library durchsuchenCreateEvent:
Zitat:

Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The event object is destroyed when its last handle has been closed.

Zitat:

Frage mich nur warum hat FastMM4 und oder EurekaLog das nicht erkannt.
Simpel: Weil sowas nicht von einem Delphi Memory Manager (MM) erfasst wird bzw. werden kann. Gleiches gilt für Icons, die man mit LoadIcon oder LoadImage lädt. Die gehen am Delphi MM vorbei, und daher bekommt der davon nix mit.

Grüße
Dalai

Ok. Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr.
Seite 3 von 3     123   

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