Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: StringFileInfo/VarFileInfo für Dateiversion schreiben

  Alt 27. Mai 2009, 08:53
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;
  Mit Zitat antworten Zitat