String wird bei konvertierung nicht korrekt verarbeitet

Experience1986

Erfahrenes Mitglied
Hi,

Ich hab ein Programm, das Daten (Autostart-EInträge) in eine INI Datei sepichert. Über meine Funktion
Code:
function _MyInIStrR(IniFile,IniSection,IniName:String):PChar;
var ini: TIniFile;
begin
  ini:=TIniFile.Create(IniFile);
  try
    Result:=PChar(ini.ReadString(IniSection,IniName,'Error0'));
  finally
    ini.free;
  end;
end;

Lade ich diese Dateien wieder ein. Ich muss den Wert über PChar zurücknehmen, weil die Funktion in einer DLL steckt, und ich keine Lust hab, die DLL mit ShareMem und CO umzubasteln. Also konvertiere ich die Daten lieber.

Hier nun eine INI Datei:
[aae]
Root=HKEY_LOCAL_MACHINE
Path=SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Name=ATIPTA
Value=C:\Programme\ATI Technologies\ATI Control Panel\atiptaxx.exe

Wenn ich nun mit meiner Funktion den Wert von "Root" AUslese (F=INI Datei):
Code:
vRegRootStr:=String(_MyInIStrR(F,'aae','Root'));

Dann liefert mir die Funktion nur den String
HKEY_LOCAL_MACHI

zurück, das selbe passiert auch bei anderen INI Datein unter dem Value Punkt, wenn dieser zum Beispiel:
Value=C:\Programme\Trillian\trillian.exe
lautet, dann liefert mir meine Funktion C:\Programme\Trillian\trillian.e0 zurück.

Woran liegt, das?
Ich kenne mich mit der Konvertierung von PChar auf String und umgekehrt nit wirklich aus, hatte einfach mal rumgetestet und bin dann auf die Funktionen PChar() und String gestoßen, was bisher auch immer funktioniert hatte. Mache ich etwas falsch oder woran liegt es, ich bastel da nun schon seit 3 stunden und mehr rum, ich verzweifel bald.
 
PChar ist ein Pointer to char, also in etwa die Adresse, an der die gewünschte Zeichenkette zu finden ist.
In deinem Fall wandelst Du einen (in der Funktion lokal bekannten) String in einen PChar, d.h., die übergibst nur die Adresse, an der der String im Speicher liegt.

PROBLEM:
Nach Ende der Funktion wird der Speicher, auf den dieser Pointer zeigt nicht mehr verwendet (hier steht halt noch der alte Müll drin).

Du müßtest die Funktion so aufrufen, dass dir bereits einen Speicherbereich (Array), in dem das Ergebnis landen soll als Parameter übergibst:

verkürzt braucht Du beispielsweise:
Variablen:
ArrayErgebnis : array[0..SOVIELDUBRAUCHST] of char;
pCharErg : pchar;


Hier dann der Aufruf:
pCharErg:=_MyIniStr(IniFile,IniSection,IniName,ArrayErgebnis);

Und die passende Funktion:
function _MyInIStrR(IniFile,IniSection,IniName:String; var Ergebnis:pChar):pChar;

In der Funktion mußt Du dann den eingelesen Text in ArrayErgebnis einlesen.

Nun wurde es doch etwas unübersichtlich, bin etwas in Eile, hoffe es hilf Dir weiter...
 
HMm, versteh garnix davon :(

Naja, wenn du willst kannst du es ja mal ausführlich erklären.

Bis dahin nutze ich die Funktion direkt in meinem Programm, sprich nicht aus der DLL.
 
Zurück