![]() |
AW: StringReplace verursacht AV
Zitat:
Ihr wollt nicht verstehen das es Unit übergreifend passiert. Egal wo ich Stringreplace verwende kracht es das hat nix mit dem Speicher zu tun. Wenn ich in Unit 1 die länge eines Arrays falsch definiere. Warum gibt mir dann Unit 3 und Unit 5 nur an den Stellen wo ich Stringreplace verwende einen AV aus? Was hat das jetzt mit dem Speicher zu tun? Und Zufall ist das schon gar nicht. Wenn ich nun an gleicher stelle im Code eine andere Funktion verwende passiert nichts.. das soll Zufall sein? Bei nichten. Und ja wie schon gesagt das Array wird in einer privaten Classe generiert. gruss |
AW: StringReplace verursacht AV
Zitat:
Zitat:
Zitat:
Wie schon erklärt wurde, ist es komplett egal in welcher Unit oder Klasse sich dein Code befindet. Letzten Endes steht alles im selben virtuellen Speicherbereich des Prozesses. Zitat:
|
AW: StringReplace verursacht AV
Zitat:
War halt nur verstutzt weil es immer nur bei StringReplace auftrat. gruss |
AW: StringReplace verursacht AV
Der Unterschied zwischen StringReplace und StripHotKey ist, daß StripHotKey ausschließlich mit Delete arbeitet und dabei den String im selben Speicherbereich hält, während StringReplace einen neuen String zurück gibt. Danach wird dann der alte String freigegeben - was auch problemlos funktioniert, wenn es denn ein richtiger String ist und nicht per string-Cast aus einem PWideChar entstanden ist.
|
AW: StringReplace verursacht AV
Zitat:
Das hätte das Problem nicht ausgelöst. Aber gut ich weis nun bescheid das es kein StringReplace Problem ist. Danke. gruss |
AW: StringReplace verursacht AV
Zitat:
|
AW: StringReplace verursacht AV
Zitat:
![]() |
AW: StringReplace verursacht AV
Dein "Zufall":
Delphi-Quellcode:
const
PositionVonStringReplace = 14346027; Gott: array[0..3] of AnsiChar = 'Himi'; var MeinSpeicherDenIchGleichÜberschreibenWill: {Pointer}Integer; begin RandSeed := Integer(Gott); MeinSpeicherDenIchGleichÜberschreibenWill := Random(999999999); // Zufällige Speicherposition suchen if MeinSpeicherDenIchGleichÜberschreibenWill = PositionVonStringReplace then ShowMessage('Gleich ist StringReplace kaputt :('); end; Rein theoretisch kann neu zu reservierender Speicher überall im RAM landen, genauso wie DLLs nicht immer an selber Stelle liegen müssen, ABER ... Vorallem Delphi DLLs liegen gern nicht dort, wo sie sollen, denn fast niemand gibt eine ordentliche ImageBaseAddress an, womit fast alle Delphi-DLLs eigentlich an selber Stelle liegen würden und Windows sowieso Diese immer an dererer Stelle laden muß, aber Windows cached sich gern gepatchte Module und läd die DLLs dann oftmals wieder an selber Sellte, wo sie schonmal geladen wurden. Bzw. wiederverwendet die selben Module, welche bereits in einer anderen Anwendung geladen sind. FastMM/VirtualAlloc könnte jedesmal beim GetMem was Anderes liefern, aber es reagiert auch gern mal gleich, da das Programm beim Start ja auch jedesmal das Selbe macht. Auch der ProgrammCode (EXE/DLL/...) liegt im Arbeitsspeicher ... eigentlich sollte der vorm Überschreiben geschützt sein, aber man kann ihn womöglch dennoch überschreiben und jetzt muß nur noch etwas von der Funktion StringReplace überschrieben werden. Aber ganz genau kann man es letztendlich nur sagen, wenn man DEIN Programm analysiert, was es nun wirklich macht, also z.B. die letzte falsche Schleife debuggen und gucken ob und was wo überschrieben wurde. |
AW: StringReplace verursacht AV
Zitat:
Delphi-Quellcode:
deklariert ist, aber der Compiler legt dafür eine versteckte, lokale String-Variable an.
const
|
AW: StringReplace verursacht AV
Ich habe es nochmal getestet mit meiner CTRL_Hook DLL.
Dort ist ja der Fehler mit der falschen Zuordnung der Array länge. Dort tritt das Problem nicht auf trotz falscher länge. Allerdings zeichne ich dort den String auch nicht mit GDI+. Gut ohne einschalten der Bereichs Prüfung bekomme ich da auch keinen Fehler angezeigt. Und krachen tut's auch nicht. Zitat:
Was bringt mir das diese ändern zu wollen.. bzw.. Von welchen Kriterien ist das abhängig. Es muss ja irgendeinen sinn machen das diese von Borland oder wem auch immer mal festgelegt worden ist. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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 by Thomas Breitkreuz