Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar wird einfach verändert! (https://www.delphipraxis.net/66847-pchar-wird-einfach-veraendert.html)

Domestos 5. Apr 2006 11:33


PChar wird einfach verändert!
 
Also das Programm sollte eigentlich zu einer MYSQL Datenbnk verbinden. Deshalb stehen in einer ini-Datei
die Benutzerdaten die der Benutzer angegeben hat. Nun zum Problem:
Er gibt er mir den Fehler aus, dass er nicht zu #6 verbinden kann. Wenn man das Programm dann Schrittweise ausführt sieht man seltsame Dinge, die mit der User-Variablen passieren.^^
Hier die erste für mich unverständliche Änderung:
Delphi-Quellcode:
  ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'settings.ini');
  try
    muffel :=PChar(ini.ReadString('MYSQL','Name','Fehler'));
    Passwort :=PChar(ini.ReadString('MYSQL','Passwort','Fehler'));
    Timer :=ini.ReadInteger('Anderes','Zeit',0);
    Pfad :=ini.ReadString('Anderes','Pfad','Fehler');
  finally
    ini.free;
Also in der Variable muffel (hieß vorher user, dachte es könnte daran liegen und hab sie dann umbenannt^^) steht wie es sein sollte "root" darin. Aber ab "ini.free;" wird sie zu "root°" verändert.

Dann beim nächsten ini-Aufruf(in den Einstellungen) wird die Variable weiter über "¬ä¨", "\Š©" zu "#6" verändert.

Ich denk mal es ist ein ganz leicht zu lösender Fehler und hoffe deshalb auf schnele Hilfe.^^
Danke im Vorraus
Domestos

himitsu 5. Apr 2006 11:43

Re: PChar wird einfach verändert!
 
PChar nimmt nur den Pointer zu den Daten, die ihm übergeben wurden und schreibt diesen in die Variable, welcher es zugewiesen wurde,
da du jetzt aber ini.ReadString nicht erst in eine Variable (z.B. String) einließt, nimmt Delphi selber eine Temporäre Variable und übergibt den Wert von ini.ReadString dieser.
Und um effektief zu sein, nimmt Delphi natürlich nicht ständig eine Neue, sonder verwendet immer wieder die Selbe, also sobald das Passwort ausgelesen wird, wird auch der Inhalt dieser temporären Variable verändert und da aber in dein Zeiger (muffel) noch darauf Zeigt, wird natürlich auch dessen Inhalt mit geändert und am Ende auch mit Freigegeben :zwinker:

Du mußt also deine Werter aus der Ini irgendwo abspeichern (in einem eigenständigem Speicherbereich, vorzugsweise eine eigenen Variable) und darauf kannst du dir erst einen Pointer holen, wenn es dann überhaupt noch nötig ist (hast ja dann auch eine echte Variable mit den gewünschten Werten) ^^

marabu 5. Apr 2006 11:49

Re: PChar wird einfach verändert!
 
Herzlich willkommen in der Delphi-PRAXiS, Domestos.

Leider hast du ja nicht geschrieben, wie und wo deine Variablen deklariert sind. Du solltest sie auf jeden Fall als String-Variablen deklarieren und auf den gezeigten typecast verzichten. Es reicht, wenn du später PChar(user) verwendest, sobald due es für den Verbindungsaufbau brauchst.

Freundliche Grüße vom marabu

Domestos 5. Apr 2006 12:02

Re: PChar wird einfach verändert!
 
Vielen Dank für die schnellen Antworten klappt super.

Robert Marquardt 5. Apr 2006 13:20

Re: PChar wird einfach verändert!
 
Ich gehe mal davon aus das muffel und Passwort vom Typ PChar sind. Damit sind sie Zeiger.
Delphi-Quellcode:
    muffel :=PChar(ini.ReadString('MYSQL','Name','Fehler'));
    Passwort :=PChar(ini.ReadString('MYSQL','Passwort','Fehler'));
ini.readString liefert einen string. Dieser ist von Delphi dynamisch in einer anonymen Hilfsvariablen alloziiert. PChar() liefert den Zeiger auf das erste Zeichen diese strings. Nun wird aber der gelieferte string keiner Variable zugewiesen. Delphi geht also davon aus das die anonyme Hilfsvariable nun unbenutzt ist und gibt den Speicher wieder frei. Damit zeigt muffel nun auf freigegebenen Speicher.
Der naechste Aufruf von ini.ReadString alloziiert also wieder eine anonyme Hilfsvariable die mit guter Wahrscheinlichkeit den gerade freigegebenen Speicher recycled oder zumindest fuer die Verwaltung des freien Speichers verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.

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