Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   In welchem Pfad läuft ein Prozess? (https://www.delphipraxis.net/198276-welchem-pfad-laeuft-ein-prozess.html)

KodeZwerg 19. Okt 2018 20:49

AW: In welchem Pfad läuft ein Prozess?
 
Zitat:

Zitat von Luckie (Beitrag 1416150)
Da gräbt jetzt aber einer in meiner dunklen Vergangenheit. :mrgreen:

[ironie]Ein Teil Deines Codes verunsichert mich[/ironie] aber verwenden mag ich ihn dennoch 8-)
Danke für Deine tolle Seite, mit viel Augenmerk auf schmale Sachen :thumb:

Luckie 19. Okt 2018 21:04

AW: In welchem Pfad läuft ein Prozess?
 
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.

DieDolly 19. Okt 2018 21:14

AW: In welchem Pfad läuft ein Prozess?
 
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.

KodeZwerg 19. Okt 2018 21:26

AW: In welchem Pfad läuft ein Prozess?
 
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 :)

DieDolly 20. Okt 2018 10:40

AW: In welchem Pfad läuft ein Prozess?
 
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.

KodeZwerg 20. Okt 2018 12:00

AW: In welchem Pfad läuft ein Prozess?
 
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 :-)

Marco Steinebach 20. Okt 2018 14:18

AW: In welchem Pfad läuft ein Prozess?
 
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 20. Okt 2018 20:26

AW: In welchem Pfad läuft ein Prozess?
 
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

KodeZwerg 20. Okt 2018 21:21

AW: In welchem Pfad läuft ein Prozess?
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1416210)
Und nochmal, Wenn man in Michaels Code

Michaels Code ist die KillProcess() Funktion.
Zitat:

Zitat von Marco Steinebach (Beitrag 1416210)
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.

KodeZwerg 21. Okt 2018 08:11

AW: In welchem Pfad läuft ein Prozess?
 
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Seite 2 von 4     12 34      

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