AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In welchem Pfad läuft ein Prozess?

Ein Thema von Marco Steinebach · begonnen am 19. Okt 2018 · letzter Beitrag vom 27. Okt 2018
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: In welchem Pfad läuft ein Prozess?

  Alt 19. Okt 2018, 20:49
Da gräbt jetzt aber einer in meiner dunklen Vergangenheit.
[ironie]Ein Teil Deines Codes verunsichert mich[/ironie] aber verwenden mag ich ihn dennoch
Danke für Deine tolle Seite, mit viel Augenmerk auf schmale Sachen
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

AW: In welchem Pfad läuft ein Prozess?

  Alt 19. Okt 2018, 21:04
Danke. Nur ist da lange nichts mehr passiert. ich habe etwa den Anschluss verloren. Deswegen sind die Codes mit Vorsicht zu genießen. Besonders was Unicode angeht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#13

AW: In welchem Pfad läuft ein Prozess?

  Alt 19. Okt 2018, 21:14
Ich finde ein Mutex ist nur dazu geeignet, den doppelten Start eines Programms zu verhindern.
Für alles andere sollte man spezifische Lösungen vorziehen.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: In welchem Pfad läuft ein Prozess?

  Alt 19. Okt 2018, 21:26
In meiner Eigenen Mutex variante passiert ein wenig mehr als wie bei dem Sample was ich verlinkt habe.

Bei Interesse kann ich es eventuell Suchen, ich habe da mehrere Switches eingebaut so das man verschiedene Dinge damit machen kann.
1. das reguläre "NurEineInstanz" wie aus dem Code von Luckie
2. zu alter Instanz wechseln, im Vordergrund
3. alte Instanz töten bevor neue lädt
4. alte Instanz ein Kommando geben (wenn app dateinamen braucht zum beispiel, übergebe ich namen an alte Instanz und refresh diese)
5. endlos neue Instanzen schaffen
6. mehr war mir damals nicht eingefallen glaube ich

allerdings alles querbeet unsortiert unschön nur funktional, könnte man sicherlich auch schön verpacken, ich war damals zu faul und bin es heute immer noch
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#15

AW: In welchem Pfad läuft ein Prozess?

  Alt 20. Okt 2018, 10:40
Zitat:
2. zu alter Instanz wechseln, im Vordergrund
3. alte Instanz töten bevor neue lädt
Wenn du das mit deiner ProcessExists() machst, dann hast du bei Nr 3 aber ein Grundproblem:
wenn du den Code nicht in der DPR noch vor Erzeugen der Forms aufrufst, hat dein Programm schon viele unnötige Arbeit erledigt.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: In welchem Pfad läuft ein Prozess?

  Alt 20. Okt 2018, 12:00
dass das alles optionen sind ist dir schon bewusst, ja? das man nicht alle optionen auf einmal anwenden kann hoffentlich auch.
man könnte es noch mehr erweitern mit logging und all so was, war hier nicht nötig.

ohne in forms/application/messages einzugreifen würde es mir schwer fallen einen dateinamen rüberzuschaffen und app anzustubsen auch was damit zu machen, also nein, nicht nur die .dpr ist betroffen.

bei mir ists halt an mehreren ecken verankert da es nicht nur wie du schreibst "Ich finde ein Mutex ist nur dazu geeignet, den doppelten Start eines Programms zu verhindern." diesen zweck erfüllt sondern halt mehr.
es wird nicht nur verhindert sondern erweitert, was im endeffekt passieren soll geben bei mir optionen vor.

wie dem auch sei, ich bin happy damit da es all meine bedürfnisse an so etwas abdeckt. jeder so wie er mag
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#17

AW: In welchem Pfad läuft ein Prozess?

  Alt 20. Okt 2018, 14:18
Hallo zusammen,
und erstmal ganz, ganz herzlichen Dank für eure Antworten.
Also, nur zur Klärung: einen Mutex hat mein Prog ohnehin schon, ich will auch nicht wissen, ob mein Programm selbst läuft, sondern ob der User einen sog. ScreenReader gestartet hat, und wenn ja, in welchem Verzeichnis der läuft, damit ich dann, so der User will, dafür ein Skript installieren kann. (nein, das ist ein Skript für den ScreenReader, kein Virus-Ding. .
Aber das kommt davon, wenn man erst winselt, und dann guckt,ich dachte, dass die ToolHelp32 eine Extra-Komponente ist, die dann, wahrscheinlich, nicht mehr mit meinem alten D5 Pro läuft - aber siehe da, ist es gar nicht.

So. Und jetzt geht's ans Code verstehen!

Herzlichen Dank nochmal und viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#18

AW: In welchem Pfad läuft ein Prozess?

  Alt 20. Okt 2018, 20:26
Und nochmal,
Wenn man in Michaels Code
Code:
if GetModuleFileNameEx (myHandle, 0, PChar(fullPath), MAX_PATH) > 0 then}
durch
Code:
var
  fLen: cardinal;
   ...
  fLen := max_path;
  if QueryFullProcessImageName (myHandle, 0, PChar(fullPath), @len) then
ersätzt, geht das ganze auch für 64-Bit-Prozesse, die von einem 32-Bit-Programm abgefragt werden.
Dazu noch
Code:
function QueryFullProcessImageName( hProcess: THandle;
    dwFlags: DWORD;
    lpExeName: PChar;
    nSize: PDWORD): BOOL; stdcall;
    external kernel32 name 'QueryFullProcessImageNameA';
in die Unit einfügen.

Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: In welchem Pfad läuft ein Prozess?

  Alt 20. Okt 2018, 21:21
Und nochmal, Wenn man in Michaels Code
Michaels Code ist die KillProcess() Funktion.
external kernel32 name 'QueryFullProcessImageNameA';
Da ich nun weiß worum es Dir mehr oder weniger geht und ich die ANSI Version gelesen habe, war ich so frei es noch mal zu überarbeiten, etwas gezielter für Deine Bedürfnisse:

Delphi-Quellcode:
function PidToFilename(const TargetPID: THandle): string;
type
  TQueryFullProcessImageName = function(hProcess: THandle; dwFlags: DWORD; lpExeName: PChar; nSize: PDWORD): BOOL; stdcall;
var
  hProcess: THandle;
  TargetName: array [0 .. MAX_PATH - 1] of Char;
  QueryFullProcessImageName: TQueryFullProcessImageName;
  nSize: cardinal;
begin
  Result := '';
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, TargetPID);
  if hProcess <> 0 then
    try
      if GetModuleFileNameEX(hProcess, 0, TargetName, MAX_PATH) <> 0 then Result := TargetName
      else if Win32MajorVersion >= 6 then
      begin
        nSize := MAX_PATH;
        ZeroMemory(@TargetName, MAX_PATH);
        @QueryFullProcessImageName := GetProcAddress(GetModuleHandle('kernel32'), 'QueryFullProcessImageNameW');
        if Assigned(QueryFullProcessImageName) then
          if QueryFullProcessImageName(hProcess, 0, TargetName, @nSize) then Result := TargetName
      end;
    finally
      CloseHandle(hProcess);
    end;
end;

function ProcessExists(const AFileName: string; var FoundFiles: TStringList; out HostIndex: Integer): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  fullPath: string;
  myHandle: THandle;
  myPID: DWORD;
  OwnPID: Cardinal;
begin
  HostIndex := -1;
  FoundFiles := TStringList.Create;
  OwnPID := GetCurrentProcessId;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExtractFileName(AFileName)) then
    begin
      myPID := FProcessEntry32.th32ProcessID;
      fullPath := PidToFilename(myPID);
      FoundFiles.Add(fullPath);
      if (myPID = OwnPID) then HostIndex := FoundFiles.Count-1;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: TStringList;
  i, idx: Integer;
begin
  Memo1.Clear;
  processExists(Application.ExeName,S, idx);
  for i := 0 to S.Count -1 do
    Memo1.Lines.Add(S.Strings[i]);
  if (idx >= 0) then Memo1.Lines.Add('Host is '+S.Strings[idx]);
end;
So sollte es auch mit Unicode hoffentlich zurecht kommen.
Als Rückgabe hast Du nach wie vor die Liste plus den Index vom Host, vielleicht hilft es Dir.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: In welchem Pfad läuft ein Prozess?

  Alt 21. Okt 2018, 08:11
Ps: Für Dein Delphi 5 musst Du Char mit WideChar und String mit WideString ersetzen (ich kann es nicht prüfen da ich version 5 nicht habe)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Alt 21. Okt 2018, 08:27     Erstellt von Schokohase
Dieser Beitrag wurde von mkinzler gelöscht. - Grund: Gelöscht auf Wunsch des Erstellers, nach dem er den Inhalt schon gelöscht hat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 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