![]() |
UpdateResource/TResourceStream Probleme mit Delphi 2009
Hallo,
die nachfolgenden Funktionen habe ich mit einem Delphi 5 Projekt problemlos genutzt. Damit kann man Strings als Resource in eine EXE schreiben und wieder auslesen. Beim Auslesen ist der ausgelesene String nur halb so lang wie das Original. Wie kann man das lösen?
Delphi-Quellcode:
function LoadStrFromResDef(const ResName, Default: string): string;
var ResStream: TResourceStream; begin if FindResource(HInstance, PChar(AnsiUpperCase(ResName)), RT_STRING) = 0 then Result := Default else begin ResStream := TResourceStream.Create(HInstance, AnsiUpperCase(ResName), RT_STRING); try SetLength(Result, ResStream.Size); ResStream.ReadBuffer(Result[1], ResStream.Size); finally ResStream.Free end; end; end; function SaveStrToRes(const FileName: string; Data: TStringList): Boolean; procedure SplitKeyValue(const s: string; out Key, Value: string; Separator: string = '='); var P: Integer; begin P := Pos(Separator, s); if P < 1 then begin Key := s; Value := ''; end else begin Key := Copy(s, 1, P - 1); Value := Copy(s, P + Length(Separator), Length(s)); end; end; var hInst: Cardinal; Key, Value: string; i: Integer; begin Result := False; if FileExists(FileName) and (Data.Count > 0) then begin hInst := BeginUpdateResource(PChar(FileName), False); if hInst > 0 then try for i := 0 to Data.Count - 1 do begin SplitKeyValue(Data[i], Key, Value); Result := UpdateResource(hInst, RT_STRING, PChar(AnsiUpperCase(Key)), LANG_NEUTRAL, @Value[1], Length(Value)) and Result; //if not result then // showmessage(IntToStr(GetLastError)); end; finally EndUpdateResource(hInst, False); end; end; end; procedure TForm1.Button1Click(Sender: TObject); var Strings: TStringList; begin Strings := TStringList.Create; try Strings.Add('Key1=Value1'); Strings.Add('Key2=Value2'); SaveStrToRes('Bsp.exe', Strings) finally Strings.Free; end; end; Und in der Bsp.exe Caption := LoadStrFromResDef('Key1', 'DEF'); |
Re: UpdateResource/TResourceStream Probleme mit Delphi 2009
In D2009 ist String ein UnicodeString
und demnach doppelt so lang, wie seine Längenangabe ... dieses mußt du natürlich anpassen beim Scheiben * Length(S) * SizeOf(Char) und beim Lesen * SetLength(S, DataSize div SizeOf(Char)); |
Re: UpdateResource/TResourceStream Probleme mit Delphi 2009
OK, danke. Ist es nicht besser man schreibt
Delphi-Quellcode:
statt
var
s: string begin Length(S) * SizeOf(s[1]) ...
Delphi-Quellcode:
Bei der ersten Lösung hat man dann die richtige Größe auch wenn sich der Typ von s mal ändern sollte. Kann ich denn auch SizeOf(s[1]) schreiben, wenn s leer ist? Eigenlich müsste das doch eine Schutzverletzung geben, da es kein erstes Element gibt? Läuft aber ohne Probleme.
Length(S) * SizeOf(Char)
|
Re: UpdateResource/TResourceStream Probleme mit Delphi 2009
SizeOf muss den übergebenen Ausdruck nicht auswerten, sondern nur dessen Typ ermitteln. Und der Compiler weiß eben, dass s[x] immer ein Char ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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