function TForm1.SearchForStringInDLL(
const DLLFilename, aText:
String): Integer;
{Quick and Dirty SuchAlgo für Zeichenketten in einer binären Datei
D.h. es muss nicht unbedingt eine DLL sein. Es funktioniert mit jedem
Dateiformat.
Wenn der SuchText nicht gefunden wurde, gibt die Funktion -1 zurück.}
var
Filestream : TFilestream;
HelpStr :
String;
ReadLen : Integer;
TextLen : Integer;
begin
Result:=-1;
// Default Ergebnis
ReadLen:=Length(aText);
// Wieviel Bytes sollen aus dem Stream gelesen werden
SetLength(HelpStr,ReadLen);
// Hilfsvariable auf die Länge des Suchtextes setzen
TextLen:=ReadLen;
// Länge des Suchtextes merken
Filestream:=TFilestream.Create(DLLFilename,fmOpenRead);
// Stream öffnen
Try
Filestream.Seek(0,soFromBeginning);
// Position sicherheitshalber auf den Anfang setzen
While Filestream.Position<Filestream.Size
do
begin
Filestream.
Read(Pointer(HelpStr)^,ReadLen);
// ReadLen Zeichen aus dem Stream lesen
ListBox1.Items.Add(HelpStr);
// Für Testzwecke
Label5.Caption:=IntToStr(Filestream.Position);
Application.ProcessMessages;
// Für Testzwecke
{ReadLen enthält nach Filestream.Read die Anzahl der gelesen Zeichen.
Wenn am Ende nicht TextLen Zeichen gelesen wurden wurde das Dateiende
erreicht und der gesuchte String kann nicht enthalten sein}
If Readlen=TextLen
then
begin
If HelpStr=aText
then // SuchText gefunden
begin
{Von der aktuellen Position, die jetzt ein Zeichen hinter dem
SuchText steht wird jetzt die Länge des SuchTextes abgezogen.
Dann steht in Result die Position des ersten Zeichenes des
SuchTextes}
Result:=Filestream.Position-TextLen;
Exit;
end
else
{Nicht gefunden. D.h. Position auf das nächste Zeichen setzen.
Da die aktuelle Position ein Zeichen hinter den gelesenen
Zeichen ist, muss (TextLen-1) Zeichen im Strema nach "links"
gegangen werden, damit die neue Position für Filestream.Read
ein Zeichen hinter der letzten Position ist. Aber nur, wenn
noch TextLen Zeichen gelesen werden können.}
If (Filestream.Position+TextLen)<Filestream.Size
then
Filestream.Seek(-(TextLen-1),soFromCurrent);
end;
end;
Finally
Filestream.Free;
end;
end;