Hallo Liebe Community,
ich Versuche hier mal mein Problem zu schildern...
Folgendes, ich programmiere recht erfolgreich die unterschiedlichsten Trainer für verschiedene Games.
Nun kann es manchmal passieren das ein User den entsprechenden Trainer passend zur Spielversion nutzt, aber dennoch nicht funktioniert. So, nun habe ich mir einen Address Searcher gebastelt welchen dann ein User nutzen kann bzw. ich die entsprechenden Offsets im Spieleprozess auf dem Rechner des Users suche. Das funktioniert auch soweit, das ist nicht das Problem.
Nun bin ich dabei diesen Searcher zu optimieren und wollte nun eine ProgressBar einbauen.
Der Code sieht nun folgendermaßen aus...
Code:
procedure StatusShown();
begin
// Label Caption - Anzeige was gemacht wird...
Form1.ProgressBar1.StepBy(5);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Search Button deaktivieren
Button1.Enabled:= False;
// ProgressBar zurücksetzen bzw. auf Anfang
ProgressBar1.Position:= 0;
ProgressBar1.Min:= 0;
ProgressBar1.Max:= 300;
// MD5 Hash ermitteln
MD5Hash:= MD5(GetModulePath(ProcessFile, ProcID));
StatusShown();
//Dateipfad ermitteln
Dateipfad:= GetModulePath(ProcessFile, ProcID);
// Dateiversion ermitteln
Versionsergebnis:= GetFileVersion(Dateipfad);
StatusShown();
// Produktversion ermitteln
Produktversion:= GetFileInfo(Dateipfad, 'ProductVersion');
StatusShown();
// Basisadresse ermitteln
GetBaseAddy(DLLName, BaseAddy);
// Hier werden die einzelnen Addy's gesucht...
// Beispiel...
// AmmoAddy:= Search(AmmoSearch);
SectionAuslesen(BaseAddy);
StatusShown;
HealthAddy:= SearchMore(BaseAddy, HealthSearch);
StatusShown;
OneHitKillAddy:= SearchMore(BaseAddy, OneHitKillSearch);
StatusShown;
Stamina1Addy:= SearchMore(BaseAddy, Stamina1Search);
StatusShown;
Stamina2Addy:= SearchMore(BaseAddy, Stamina2Search);
StatusShown;
AmmoAddy:= SearchMore(BaseAddy, AmmoSearch);
StatusShown;
NoReloadAddy:= SearchMore(BaseAddy, NoReloadSearch);
StatusShown;
ThrowablesAddy:= SearchMore(BaseAddy, ThrowablesSearch);
StatusShown;
FreeSection;
// Die Anzahl der auszulesenden Bytes kann/sollte noch angepasst werden...
HealthValue:= ReadMemory(50, HealthAddy);
StatusShown;
OneHitKillValue:= ReadMemory(50, OneHitKillAddy);
StatusShown;
Stamina1Value:= ReadMemory(50, Stamina1Addy);
StatusShown;
Stamina2Value:= ReadMemory(50, Stamina2Addy);
StatusShown;
AmmoValue:= ReadMemory(50, AmmoAddy);
StatusShown;
NoReloadValue:= ReadMemory(50, NoReloadAddy);
StatusShown;
ThrowablesValue:= ReadMemory(50, ThrowablesAddy);
StatusShown;
end;
// Search Button aktivieren
Button1.Enabled:= True;
if ProcID = -1 then begin
Label1.Caption:= 'DyingLightGame.exe not found in memory...' + #13#10 +
'Please make sure that the game is running...';
end;
end;
Nun ist es ja so daß die ProgressBar innerhalb dieses Button.Click Ereignisses zwar aktualisiert wird, allerdings ist dieses nicht sichtbar. Erst wenn die Button Prozedur komplett abgearbeitet wurde ist auch die ProgressBar bei 100%. Als workaround hab ich die "ProgressBar1.Stepby(5)" innerhalb einer eigenen Prozedur verfasst. Das funktioniert auch soweit ganz gut, wenn da nicht die Antiviren-/Firewalllösung dazwischen funken würde. Ich nutze z.B. Kaspersky, wenn der Searcher ausgeführt wird meldet sich Kaspersky und ich muss z.B. das Ausführen des Programms erlauben. Ist ja auch okay, aber die ProgressBar wird wiederrum erst nach dem kompletten abarbeiten geändert. Starte ich diesen Searcher das zweite Mal (mittlerweile ist der Searcher Kaspersky bekannt) dann funktioniert auch das updaten der ProgressBar.
Nun wäre meine Frage ob es nicht eine bessere Lösung hierfür gibt. Mit Threads habe ich hier noch nicht gearbeitet, das wäre noch meine nächste Idee...
Vielen Dank für's aufmerksame lesen und vielen Dank für eure Lösungsvorschläge...
MfG sILeNt