Spróbuj tym kodem. Ślęczałem nad nim i wykombinowałem coś takiego: Wiem, że czytanie po jednym bajcie jest mało
optymalne, ale dla wsadzonego exeka w bajtach 1 277 952 funkcja wykonuje się 576 milisekund, także do przyjęcia, a
jak jesteś ambitny to na podstawie tej mojej funkcji spróbuj napisać taką aby sprawdzała większy bufor, ja próbowalem
jednak nie za bardzo to mi wyszło. Wyszukiwanie zmienionego miejsca potrafię zrobić, lecz elegancka podmiena tekstu
w wybranym buforze, a później zapis do streamie albo zapis oryginalnego bajtu do streama, jeżeli ten nie jest znakiem
szukanego słowa - mi nie wyszło. Jak potrzebujesz CaseSensitive i tym podobne - to już kombinuj coś sam. Chyba, że
ktoś Ciebie tutaj wyręczy. Może i są jakieś gotowe kody na googlach, lecz nie udało mi się znaleźć coś odpowiedniego.
function ReplaceTextInStream(SourceStream : TStream; TextToFind, NewText : string) : TMemoryStream;
var
B : Byte;
I : int64;
X : integer;
S, TmpS : string;
MS : TMemoryStream;
begin
MS := TMemoryStream.Create;
Result := TMemoryStream.Create;
if (TextToFind = '') or (NewText = '') then
begin
Exit;
end;
TmpS := Copy(TextToFind, 1, 1);
MS.LoadFromStream(SourceStream);
MS.Position := 0;
I := 0;
repeat
S := TmpS;
MS.Position := I;
MS.Read(B, 1);
Result.Write(B, 1);
if Length(TextToFind) = 1 then
begin
TextToFind := Chr(Integer(B));
end;
if B = Byte(TextToFind[1]) then
begin
for X := 1 to Length(TextToFind) - 1 do
begin
MS.Read(B, 1);
S := S + Chr(Integer(B));
end;
end;
if (S = TextToFind) then
begin
Result.Position := Result.Position - 1;
Result.Write(PChar(NewText)^, Length(NewText));
I := I + Length(TextToFind);
end
else
begin
I := I + 1;
end;
until I = MS.Size;
MS.Free;
end;
procedure TForm1.Button1Click(Sender : TObject);
{$R zasoby.res}
var
MS : TMemoryStream;
RS : TResourceStream;
Start, Stop : Cardinal;
begin
RS := TResourceStream.Create(HInstance, 'nazwa_zasobu', RT_RCDATA);
Start := GetTickCount;
MS := ReplaceTextInStream(RS, 'dos', 'inny_wyraz');
Stop := GetTickCount;
ShowMessage('Czas wykonania funkcji: ' + IntToStr(Stop - Start));
MS.SaveToFile('test.bin');
end;