Zitat von
Mazel:
Wenn ich dein Code als Grundlage nehme verarbeite ich am Ende den AnsiChar. Ich bräuchte ja aber den Pointer, damit ich diesen an Children weitergeben kann.
Nein, man kann doch AnsiStrings wunderbar mit dem pluszeichen miteinander verketten.
Dabei werden die beteiligten Stringstücke in einen neuen String kopiert.
Mit der Technik von Zacherl könnte man sich die kopierei sparen, aber so ist es viel eleganter.
alles ungetestet:
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);
// Key und Value auf den Ergebnisstring kopieren
Move(key[1], p^, length(key)*2);
Inc(p, length(key)*2);
Move(Value, p^, length(value)*2);
// hoffentlich war die Längenberechnung von result richtig ;-)
end;
function BuildStringTableStructure(Key:WideString; const Children:Ansistring):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)); // wird später noch länger...
p := PInteger(PChar(result));
p^ := length(Result) + length(Children); // WORD wLength befüllen
Inc(p);
p^ := length(Children) * 2; // WORD wValueLength befüllen
Inc(p);
p^ := 1; // WORD wType
Inc(p);
Move(key[1], p^, length(key)*2);
// einfach den übergebenen Children-Datenblock hinten anhängen
Result := Result + Children;
end;
function BuildStringFileInfoStructure(const Children:Ansistring):AnsiString;
begin
Result := BuildStringTableStructure('StringFileInfo', Children);
end;
function BuildVarSructure(Value : Widestring):Ansistring;
begin
Result := BuildStringStructure('Translation', Value);
end;
und dann die Daten quasi von Innen nach Aussen aufbauen:
Delphi-Quellcode:
data := BuildStringStructure('
Comments', '
ein Test') + BuildStringStructure('
CompanyName', '
DP') + ....;
data := BuildStringTableStructure(LANG_CODE_8BYTES, data);
data := BuildStringFileInfoStructure(data);
Jetzt fehlt nur noch die VS_VERSIONINFO Structure:
function BuildVersionInfoStructure(const fixedinfo:TFIXEDFILEINFO;const Children:Ansistring):AnsiString;