Zitat von
Mazel:
Das heißt in dem Fall für jeden Block den ich hizufüge oder von vorn herein soviel reservieren, wie cih für alles benötige, was zur Folge habe muss, dass ich vorher die Größe brauch.
Genau das ist das Problem, was die Sache so knifflig macht.
Eine Möglichkeit wäre, mit den innersten
String Structure zu beginnen und diese dann zu einer
StringTable Structure zusammenzubauen, die dann wiederum zur
StringFileInfo Structure aufgebaut wird.
Hier völlig ungetestet als Anregung:
Delphi-Quellcode:
function BuildStringStructure(Key, Value : Widestring):Ansistring;
var
p : PInteger;
begin
key := key + #0; // Terminierung mit 0x0000
if odd(length(key)) then
key := key + #0; // auf 32-bit boundary bringen
SetLength(result, 2 + 2 + 2+ 2*Length(key) + 2 * Length(Value))
p := PInteger(PChar(result));
p^ := length(Result); // WORD wLength befüllen
Inc(p);
p^ := length(Value) * 2; // WORD wValueLength befüllen
Inc(p);
p^ := 1; // WORD wType
Inc(p);
// jetzt muss noch Key und Value in den Resultstring kopiert werden (mit Move())
// ich spar mir das mal
end;
Damit kann man jetzt mehrere String Structures zusammen verketten:
data := BuildStringStructure('Comments', 'ein Test') + BuildStringStructure('CompanyName', 'DP') + ....
Jetzt muss das zu einer StringTable Structure aufgebaut werden:
function BuildStringTableStructure(Key:WideString; const Children:Ansistring):AnsiString;
Wenn man soweit ist, ist der Aufbau der StringFileInfo Structure relativ einfach:
Delphi-Quellcode:
function BuildStringFileInfoStructure(Key:WideString; const Children:Ansistring):AnsiString;
begin
Result := BuildStringTableStructure('StringFileInfo', Children);
end;