Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Laufende Prozesse abfragen - geht, geht nicht (https://www.delphipraxis.net/194811-laufende-prozesse-abfragen-geht-geht-nicht.html)

creehawk 9. Jan 2018 10:32

Laufende Prozesse abfragen - geht, geht nicht
 
Moin Moin.

Bei der Installation von Spieldateien muss ich vor dieser Installation prüfen, ob das dazugehörige Spiel läuft. Dazu verwende ich die nachstehende Prozedur um die laufenden Prozesse aufzulisten.


Delphi-Quellcode:
uses TlHelp32;
procedure GetProcessList(const aProcessList: TStrings);
var
  Snap: THandle;
  ProcessE: TProcessEntry32;
begin
  aProcessList.Clear;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessE.dwSize := SizeOf(ProcessE);
    if Process32First(Snap, ProcessE) then
      Repeat
        aProcessList.Add(ProcessE.szExeFile);
      Until not Process32Next(Snap, ProcessE)
    else
      RaiseLastOSError;
  finally
    CloseHandle(Snap);
  end;
end;
... und die folgende schlichte Abfrage um dann eben festzstellen, ob oder ob nicht.

Delphi-Quellcode:
Prozesse:=TStringlist.Create;
GetProcessList(Prozesse);
For I:= 0 to Prozesse.Count - 1 do
   begin
      If Prozesse.Strings[I] = ExeNameString then IsActive := 1;
   end;
Die Liste wird anstandslos erstellt und enthält auch - wenn das Spiel denn läuft - den Namen der laufenden Exedatei.

Tja. Mal geht es, mal geht es nicht. 'Emperor.exe' geht nicht, 'CaesarIV.exe' geht - mal als Beispiel.

Was kann das sein?

creehawk

EWeiss 9. Jan 2018 10:38

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Schon mal geschaut ob 'Emperor.exe' überhaupt als Prozess gelistet ist?
Mitunter sind es irgendwelche launscher welche den Prozess starten diesen aber nach dem start auch wieder zerstören.
Mal den Process Explorer von Sysinternals verwenden um zu prüfen ob die Prozesse dort aufgelistet werden.
Bzw. prüfen was da vorgeschaltet wird.

gruss

Jasocul 9. Jan 2018 10:39

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Wenn die Liste das Programm enthält, dann schlägt wohl der String-Vergleich fehl.
Spontan fallen mir diese Klassiker ein:
- Case-Sensitive
- Leading/Trailing Blanks
- "unsichtbare" Zeichen

DeddyH 9. Jan 2018 10:40

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Was heißt denn "geht nicht"? Ist das Spiel nicht in der Liste, oder findet Dein Vergleich den Eintrag nicht?

creehawk 9. Jan 2018 10:43

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Also Case Sensitve haben ich schon exerziert, Uppercase und so - keine Reaktion.

Die Prozesse sind laut einem externen Programm vorhanden, ich kann ausserdem über Windows auch in das Spiel einschalten, es läuft definitiv.

Unsichtbare Zeichen? Wie kann ich das rauskriegen?

Edit: Der Vergleich geht nicht, das Spiel (also die Exe) ist in der Liste....

creehawk

Jasocul 9. Jan 2018 10:46

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Du verlässt dich auf externe Programme? :wink:
Deine Prozessliste ist eine Stringlist. Mache einfach ein SaveToFile und schau dir genau an, was dort enthalten ist. Dann kannst du vermutlich auch "unsichtbare" Zeichen sehen. Notfalls mit einem Hex-Editor.

EWeiss 9. Jan 2018 10:49

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Zitat:

Zitat von Jasocul (Beitrag 1390603)
Du verlässt dich auf externe Programme? :wink:
Deine Prozessliste ist eine Stringlist. Mache einfach ein SaveToFile und schau dir genau an, was dort enthalten ist. Dann kannst du vermutlich auch "unsichtbare" Zeichen sehen. Notfalls mit einem Hex-Editor.

Mal den Process Explorer von Sysinternals verwenden um zu prüfen ob die Prozesse dort aufgelistet werden.
Und mit deinem String vergleichen.

gruss

TiGü 9. Jan 2018 10:52

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Delphi-Quellcode:
Prozesse:=TStringlist.Create;
GetProcessList(Prozesse);
For I:= 0 to Prozesse.Count - 1 do
   begin

      OutputDebugString(PChar('Prozess: ' + Prozesse.Strings[I] + ' - ' + ExeNameString)); // was erscheint denn im Eventlog?

      If Prozesse.Strings[I] = ExeNameString then
        IsActive := 1;
   end;

DeddyH 9. Jan 2018 11:14

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Mal aus der hohlen Hand:
Delphi-Quellcode:
Prozesse := TStringlist.Create;
try
  GetProcessList(Prozesse);
  For I := 0 to Prozesse.Count - 1 do
    If AnsiSameText(Trim(Prozesse[I]), ExeNameString) then
      begin
        IsActive := 1;
        break;
      end;
finally
  Prozesse.Free;
end;

CCRDude 9. Jan 2018 12:56

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Ich würde mir auch mal die TStringList nehmen und mit dem Task-Manager auf 32/64 bit bzw. elevated/non-elevated vergleichen, ich meine mich zu erinnern, dass es da Einschränkungen gab.

Ansonsten, solange die Liste der Spiele überschaubar bleibt, würde ich eher z.B. schauen, ob die Spiele einen eindeutig benannten Mutex verwenden, das dürfte schneller gehen als CreateToolhelp32Snapshot.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz