Hallo Leute,
ich stelle euch hier mal eine von mir geschriebene Unit vor, die ich phantasieloserweise uBuilder genannt habe.
Die Verwendung ist einfach und die Funktionen eigtl. selbsterklärend:


function AppendInfo (Exename, Name, Info : String) : Boolean;
(Hängt den String Info an die Exedatei mit dem Bezeichner Name an, falls der Name schon existiert, wird False zurückgegeben)

function AppendOrReplace(Exename, Name, Info : String) : Boolean;
(Macht da gleiche wie AppendInfo, nur wird die Information überschrieben, falls der Name schon vergeben ist)

function ReadInfo (Exename, Name : String) : String;
(gibt den String zurück, der unter dem bezeichner abgelegt ist)

function DeleteAllInfo (Exename : String) :Boolean;
(Löscht alle Infos, die an eine Exedatei angehängt wurden)



Die Unit:
Code:
unit uBuilder;
{
~  Anhängen von Strings an Dateien leicht gemacht  ~
~uBuilder Unit von Hamtaro - Kontakt ICQ: 383065218~
~Release Datum: 21.01.2008 - Going Down, Down, Down~
}
interface
uses sysutils,classes;

function AppendInfo     (Exename, Name, Info : String) : Boolean;
function AppendOrReplace(Exename, Name, Info : String) : Boolean;
function ReadInfo       (Exename, Name : String)       : String;
function DeleteAllInfo  (Exename : String)             :Boolean;
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
var Delimiter1      : String = '<in';
    Delimiter2      : String = 'f¤>';
    InnerDelimiter : String = '¦';

type TStringArray = Array of String;

implementation
//Die Explode funktion hab ich da her: http://www.delphipraxis.net/topic381...+erzeugen.html
function Explode(const Separator, S: string; Limit: Integer = 0): TStringArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;

function ReadWholeFile(exename : String) : String;
var
Datei : TFileStream;
begin
Datei := TFilestream.Create(Exename, fmShareDenyNone or fmOpenRead);
Datei.Seek(0,soFromBeginning);
SetLength(Result,Datei.Size);
Datei.Read(Result[1], Datei.Size);
Datei.Free;
end;


function ReadAllInfo(Exename : string) : String;
begin
Result := Copy(ReadWholeFile(Exename),Pos(Delimiter1 + Delimiter2,ReadWholeFile(Exename)),Length(ReadWholeFile(Exename)));
end;


function AppendInfo(Exename, Name, Info : String) : Boolean;
var
Datei : TFilestream;
infoString : String;
begin
Result := False;
If ReadInfo(Exename, Name) <> '' Then Exit;  //wir wollen keine doppelten
Result := True;
try
InfoString  := Delimiter1 + Delimiter2 + Name + InnerDelimiter + Info;
Datei := TFilestream.Create(Exename, fmOpenReadWrite or fmShareDenyWrite);
Datei.Seek(0, soFromEnd);
Datei.Write(Pointer(InfoString)^, Length(InfoString));
except
Result := False;
end;
Datei.Free;
end;


function AppendOrReplace(Exename, Name, Info : String) : Boolean;
var
Datei : TFilestream;
alleInfos : String;
neueInfos : String;
begin
result := True;
try
If ReadInfo(Exename,Name) = '' Then begin
  AppendInfo(Exename,Name,Info);
  Exit;
end;
AlleInfos := ReadAllInfo(Exename);
neueInfos := StringReplace(AlleInfos, '<inf¤>' + Name + '¦' + ReadInfo(Exename,Name),'<inf¤>' + Name + '¦' + Info, []);
DeleteAllInfo(Exename);
Datei := TFilestream.Create(Exename,fmOpenWrite Or fmShareDenyNone);
Datei.Seek(0,soFromEnd);
Datei.Write(Pointer(neueInfos)^,Length(neueInfos));
Datei.Free;
except
Result := false;
end;
end;


function DeleteAllInfo(Exename : String) : Boolean;
var
Datei : TFileStream;
ganzeDatei : String;
ohneInfos : String;
begin
Result := True;
try
ganzeDatei := ReadWholeFile(Exename);
ohneInfos := Copy(ReadWholeFIle(Exename),0,Pos(Delimiter1 + Delimiter2,ganzeDatei) - 1);
DeleteFile(Exename);
Datei := TFileStream.Create(Exename, fmCreate Or fmShareDenyNone Or fmOpenWrite);
Datei.Write(Pointer(ohneInfos)^,Length(ohneInfos));
Datei.Free;
except
Result := False;
end;
end;


function ReadInfo  (Exename, Name : String) : String;
var
alleinfos : String;
aInfos : TStringArray;
i : Integer;
begin
alleInfos := ReadAllInfo(Exename);
aInfos := Explode(Delimiter1 + Delimiter2, alleInfos);
For i := 0 To High(aInfos) do begin
  If Copy(aInfos[i],0, Pos(Innerdelimiter,aInfos[i]) -1)= name Then
  begin Result := Copy(aInfos[i],Pos(Innerdelimiter,aInfos[i]) + 1, Length(aInfos[i]));
  exit;
  end;
end;
end;
end.

grüße
Hamtaro