![]() |
AW: In welchem Pfad läuft ein Prozess?
Zitat:
Danke für Deine tolle Seite, mit viel Augenmerk auf schmale Sachen :thumb: |
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.
|
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. |
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 :) |
AW: In welchem Pfad läuft ein Prozess?
Zitat:
wenn du den Code nicht in der DPR noch vor Erzeugen der Forms aufrufst, hat dein Programm schon viele unnötige Arbeit erledigt. |
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 :-) |
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 |
AW: In welchem Pfad läuft ein Prozess?
Und nochmal,
Wenn man in Michaels Code
Code:
durch
if GetModuleFileNameEx (myHandle, 0, PChar(fullPath), MAX_PATH) > 0 then}
Code:
ersätzt, geht das ganze auch für 64-Bit-Prozesse, die von einem 32-Bit-Programm abgefragt werden.
var
fLen: cardinal; ... fLen := max_path; if QueryFullProcessImageName (myHandle, 0, PChar(fullPath), @len) then Dazu noch
Code:
in die Unit einfügen.
function QueryFullProcessImageName( hProcess: THandle;
dwFlags: DWORD; lpExeName: PChar; nSize: PDWORD): BOOL; stdcall; external kernel32 name 'QueryFullProcessImageNameA'; Viele Grüße Marco |
AW: In welchem Pfad läuft ein Prozess?
Zitat:
Zitat:
Delphi-Quellcode:
So sollte es auch mit Unicode hoffentlich zurecht kommen.
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; Als Rückgabe hast Du nach wie vor die Liste plus den Index vom Host, vielleicht hilft es Dir. |
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 17:57 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