AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Frage zu DLL

Ein Thema von Luki206 · begonnen am 29. Nov 2013 · letzter Beitrag vom 1. Dez 2013
 
Benutzerbild von himitsu
himitsu

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

AW: Frage zu DLL

  Alt 29. Nov 2013, 17:54
Der Speichermanager wirft mit Exceptions um sich, wenn er einen falschen Zeiger, der nicht ihm gehört, zum Freigeben bekommt, oder für's Ändern der Größe.

Und wenn das Programm auf einen "falschen" Typ trüft, der nicht zu seiner Umgebung gehört, dann können Adressen und gemeinsam genutzte Objekte ein schönes Chaos ergeben, was dann auch in netten Exceptions oder in netten fehlerhaften Speicherzugriffen (Buffer Overun und Co.) enden, was dann sofort oder erst später knallt, wenn der entsprechende zerschossene Speicher dann benutzt wird.

Delphi-Quellcode:
type
  TMyClass = class
    FeldA: Integer; // liegt im Speicher am Offset +A
    FeldB: Integer; // liegt im Speicher am Offset +B
    procedure MachWasX; virtual; // Adresse liegt in der RTTI am Offset +X
    procedure MachWasZ; virtual; // Adresse liegt in der RTTI am Offset +Y
  end;
Im Prinzip kann Delphi nichtbenutztes entfernen und das wird dann garnicht erst einkompilert. (auch wenn das dank der neuen RTTI nicht immer so ist ... ratet mal, warum die EXEn immer größer werden ... weil auch potentiell ungenutztes einkompiliert wird .... könnte ja sein, daß man via RTTI drauf zugreift, aber da wäre es schöner, wenn mich Delphi vorher gefragt hätte und ich ihm explizit sage, was unbedingt mit rein muß, auch wenn keine Benutzung erkannt wird)

Die EXE greift nur auf FeldB und MachWasZ zu ... der Compiler/Linker läßt FeldA und MachWasX einfach weg.
Die DLL haz zufällig alles benutzt und jetzt steht aber in der EXE das EXE.FeldB an der Speicherstelle von DLL.FeldA, sowie MachWasZ steht abeim Offset X,
womit dann die DLL auf die falschen Speicherbereiche/Adressen zugreift, wenn sie auf eine Objektinstanz zugreift, die von der EXE erstellt wurde. Und andersrum genauso.

Edit: Wäre es eigentlich auch möglich gleich den ganzen 'Block' also Label1.Caption := ('Hallo') in eine DLL zu setzten?
Ja, aber nur wenn man ddie Zugehörigkeiten beachtet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Nov 2013 um 18:03 Uhr)
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:22 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