AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Klatsch und Tratsch Was nervt euch so, während der Programmierung oder so allgemein
Thema durchsuchen
Ansicht
Themen-Optionen

Was nervt euch so, während der Programmierung oder so allgemein

Ein Thema von himitsu · begonnen am 26. Jun 2010 · letzter Beitrag vom 3. Mai 2013
 
Benutzerbild von himitsu
himitsu

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

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 4. Okt 2011, 12:17
Nerven tun manchmal die sinnlosesten Fehlerchen, welche aber ungehnte Nebenwirkunen zeigen.


Einen dieser Fehler hab ich mal auf folgenden Code reduziert.
Delphi-Quellcode:
procedure MacheMist;
var
  S: string;
  L: Cardinal;
begin
  L := MAX_PATH;
  GetUserName(PChar(S), L);
end;

initialization
  MacheMist;

finalization

end.
(einfach nur ein kleines SetLength(S, i); vergessen)



OK, S ist als Leerstring NIL, also sollte GetUserName mit einer Zugriffsverletzung enden,
tut es aber nicht

Denn PChar leitet dieses NIL auf einen existierenden "Leerstring" um, welcher auf #0 endet.

Tja, nun ist gerade dieser Speicherplatz leider nicht schreibgeschützt (PAGE_READONLY), so wie man es von einer Konstante eventuell erwarten könnte.
Daher überschreibt jetzt GetUserName diesen Speicher und schwups, hat man sich den programmglobalen Leerstring zerschossen.

Alles was also diesen PChar-Leerstring nutzt, wird sich nun verändern.




Tipp: Nehmt eine Form, darauf 2-3 Edits, den Text jeweils rauslöschen und kompilieren+starten.
Am Besten noch mit dieser Funktion:
Delphi-Quellcode:
procedure MacheMist;
const H = 'himi war hier'#0;
var S: string;
begin
  Move(PChar(H)^, PChar(S)^, Length(H) * SizeOf(Char));
end;
Zumindestens ab Delphi 2010 (ab wann genau weiß ich nicht) und mit mindestens WinXP sieht man nun in allen Edits (ohne Fokus) seinen Nutzernamen/meinen Namen.
Genauso war das hier in DBGrids, wo dann alle leeren Zellen plötzlich gefüllt waren.


[edit]
Das Beispiel geht ab da, wo TEdit die Eigenschaft TextHint besitzt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Okt 2011 um 12:45 Uhr)
 
 


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:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Untitled document This thread Refback 7. Nov 2011 09:54

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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