Delphi-PRAXiS

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.

taveuni 9. Jan 2018 12:57

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Hast Du mal den ProcessExplorer gestartet? Ist der Prozess dort unter dem Namen den Du erwartest aufgeführt? Wenn ja unter welchem Benutzer läuft er? Möglicherweise ist er unterschiedlich zu Deinem.

creehawk 9. Jan 2018 14:02

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Donnerwetter, soviele Antworten und Möglichkeiten....

Ich ackere das jetzt mal alles durch und erstatte Bericht.

Ich danke vielmals für die Hilfe!

creehawk

creehawk 9. Jan 2018 14:53

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Jetzt wird es ganz lustig.

Ich habe noch immer die hier gepostete erste Version in der IDE am bearbeiten. Mehr zufällig habe ich die IDE beendet und die zuletzt erzeugte EXE (Debugerzeugung) direkt gestartet.

Ergebnis:
Zugriffsverletzung bei Adresse 005f130F in Modul CSetup.exe : Lesen von Adresse 00000000

Naja, IDE angeschmissen, was ist los? Nix. In der IDE kommt dieser Fehler nicht. Also mal die Release Konfiguration eingestellt. In der IDE : alles OK. Ausserhalb : Fehler. Dann den ganzen Abschnitt mit GetProzesslist etc. ausdokumentiert. Erzeugen. In der IDE : Läuft. Ausserhalb der IDE : Läuft.

Was das?

creehawk

creehawk 9. Jan 2018 15:09

AW: Laufende Prozesse abfragen - geht, geht nicht
 
Hat sich erledigt.

Ich starte normalerweise mit zwei Parametern. Wenn die nicht da sind....

creehawk

Delphi-Laie 9. Jan 2018 15:17

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

Zitat von creehawk (Beitrag 1390590)
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.

Läßt sich das nicht so simpel austricksen, daß man die zu startende Exe-Datei vor dem Starten einfach umbenennt, sodaß die Prüfung ins Leere läuft?

creehawk 10. Jan 2018 08:59

AW: Laufende Prozesse abfragen - geht, geht nicht
 
@deddyh

AnsiSameText funktioniert anstandslos.

Warum?

Die Typen? Also der Name der EXE aus der GetProzessList kommt als array of [0...256] Char in die Stringlist, den Vergeleichswert hole ich aus einer XML als WideString(MSXML).

Oder was?

creehawk

DeddyH 10. Jan 2018 12:33

AW: Laufende Prozesse abfragen - geht, geht nicht
 
System.SysUtils.AnsiSameText
Zitat:

Vergleicht zwei Strings unter Berücksichtigung des aktuellen Gebietsschemas ohne Beachtung der Groß-/Kleinschreibung.

AnsiSameStr vergleicht die beiden Strings S1 und S2, ohne dabei zwischen Groß- und Kleinschreibung zu unterscheiden. Der Vergleich wird von der aktuellen Ländereinstellung gesteuert. Der Rückgabewert ist true, wenn die Strings denselben Wert haben; andernfalls false.
Da wird halt noch so einiges berücksichtigt, was ein einfacher "="-Vergleich nicht tut. Was letztendlich genau den Unterschied in Deinen Strings ausmacht, vermag ich auch nicht zu sagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.

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