Einzelnen Beitrag anzeigen

ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#1

Aus Anwendung heraus '.exe' mit ResourceString bearbeiten

  Alt 12. Dez 2012, 16:11
Delphi-Version: XE2
Hallo, ich zerbreche mir schon den ganzen Tag den Kopf an einem Problem. Ich möchte bestimmt Info's in einer Exe speichern. Hier gibt es ein schönes Beispiel unten im Anhang. Allerdings möchte ich mehrere Strings speichern und das ganze "Variabler" machen. Also habe ich versucht die Prozedur umzustellen:

Delphi-Quellcode:
//Aufruf
  filename := ExtractFilePath(paramstr(0))+'patched'+ExtractFileName(paramstr(0));
  PatchFile(Paramstr(0), filename, 'Version', '1.0.0.1'); // eigentlich blödes Beispielt mit der Versionsnummer

//Code

procedure PatchFile(const sourcefilename, destfilename: string;
  const globalident, newconfigstr: Ansistring);
var
  exedata, magicword: Ansistring;
  p: Integer;
  pchecksum: PCardinal;
begin
  MAGIC_WORD_LEN := Length(globalident);

//globalconfigdata ist global deklariert. Schaut euch das Original an, dann ergiebt die nächste zeile Sinn
  
  globalconfigdata := #0#0#0#0 + globalident +
    #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +
    #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;

  // verhindern, dass die neuen Konfigdaten zu lang werden
  if Length(newconfigstr) > Length(globalconfigdata) - MAGIC_WORD_LEN - CHECKSUM_LEN
  then
    raise Exception.Create('Config String too long');
  magicword := GetMagicWord;

  // raise Exception.Create(magicword);

  exedata := FileToString(sourcefilename); // Exe-Datei als String laden
  p := Pos(magicword, exedata); // Magisches Wort suchen
  Assert(p <> 0);

  pchecksum := PCardinal(@exedata[p]);
  Dec(pchecksum);

  Inc(p, MAGIC_WORD_LEN); // Magisches Wort überspringen

  // Configdaten überschreiben
  Move(newconfigstr[1], exedata[p], Length(newconfigstr));
  pchecksum^ := CalcXorSum(exedata);

  // modifizierte EXE speichern
  StringToFile(destfilename, exedata);
end;
Das schreiben geht Problemlos, aber wenn ich die gepatchte Exe starte, bekomme ich kein Rückgabewert :/

[EDIT]
Natürlich habe ich auch die GetConfigString umgeschrieben:

Delphi-Quellcode:
//Auruf

Edit1.text := GetConfigString('Version');


//Code

function GetConfigString(globalident: string): string;
begin
  MAGIC_WORD_LEN := Length(globalident);

  globalconfigdata := #0#0#0#0 + globalident +
    #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +
    #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;

  Result := Copy(globalconfigdata, CHECKSUM_LEN + MAGIC_WORD_LEN + 1, 999);
end;
Lukas

Geändert von ByTheTime (12. Dez 2012 um 19:03 Uhr)
  Mit Zitat antworten Zitat