![]() |
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:
... und die folgende schlichte Abfrage um dann eben festzstellen, ob oder ob nicht.
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;
Delphi-Quellcode:
Die Liste wird anstandslos erstellt und enthält auch - wenn das Spiel denn läuft - den Namen der laufenden Exedatei.
Prozesse:=TStringlist.Create;
GetProcessList(Prozesse); For I:= 0 to Prozesse.Count - 1 do begin If Prozesse.Strings[I] = ExeNameString then IsActive := 1; end; Tja. Mal geht es, mal geht es nicht. 'Emperor.exe' geht nicht, 'CaesarIV.exe' geht - mal als Beispiel. Was kann das sein? creehawk |
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 |
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 |
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?
|
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 |
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. |
AW: Laufende Prozesse abfragen - geht, geht nicht
Zitat:
Und mit deinem String vergleichen. gruss |
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; |
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; |
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. |
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.
|
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 |
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 |
AW: Laufende Prozesse abfragen - geht, geht nicht
Hat sich erledigt.
Ich starte normalerweise mit zwei Parametern. Wenn die nicht da sind.... creehawk |
AW: Laufende Prozesse abfragen - geht, geht nicht
Zitat:
|
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 |
AW: Laufende Prozesse abfragen - geht, geht nicht
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz