Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Voller Pfad einer Anwendung anhand Handle (https://www.delphipraxis.net/27195-voller-pfad-einer-anwendung-anhand-handle.html)

OrallY 5. Aug 2004 17:13


Voller Pfad einer Anwendung anhand Handle
 
Ich versuche den vollen Pfad einer Anwendung anhand des Handles herauszubekommen. Den Dateinamen kriege ich schon, allerdings nicht den Pfad dazu:


Delphi-Quellcode:
function GetProcessNameFromWnd(hWnd: HWND): string;
var
  ProcID   : DWord;
  SSHandle : THandle;
  Continue : boolean;
  ProcEntry : TProcessEntry32;
begin
  GetWindowThreadProcessID(hWnd, @ProcID);
  SSHandle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  ProcEntry.dwSize := Sizeof(ProcEntry);
  // gehe alle Prozesse durch
  Continue := Process32First(SSHandle, ProcEntry);
  while Continue do begin
    // gesuchter Prozess (ProcID) in der Liste aller Prozesse gefunden?
    if ProcEntry.th32ProcessID = ProcID then
    begin
      Result := ProcEntry.szExeFile;
      break;
    end;
    Continue := Process32Next(SSHandle, ProcEntry);
  end;
  CloseHandle(SSHandle);
end;

Luckie 5. Aug 2004 17:27

Re: Voller Pfad einer Anwendung anhand Handle
 
Unter welchem OS. Dein Code verhält sich unter ConsumerWindows anders als unter NT ff. Aber MSDN-Library durchsuchenGetmodulefilename sollte dein Problem lösen.

MathiasSimmack 5. Aug 2004 19:03

Re: Voller Pfad einer Anwendung anhand Handle
 
Is´ Motzi da? :mrgreen: klick

NicoDE 5. Aug 2004 19:50

Re: Voller Pfad einer Anwendung anhand Handle
 
Delphi-Quellcode:
uses
  TlHelp32, PsAPI;

function GetWindowProcessImageFileName(Wnd: HWND): string;
const
  DesiredAccess = PROCESS_QUERY_INFORMATION or PROCESS_VM_READ;
var
  ProcessId: DWORD;
  Snapshot: THandle;
  ModuleEntry: TModuleEntry32;
  Process: DWORD;
  Module: HMODULE;
  Needed: DWORD;
  FileName: array [0..MAX_PATH-1] of Char;
begin
  SetLength(Result, 0);
  ProcessId := 0;
  GetWindowThreadProcessId(Wnd, ProcessId);
  if 0 = ProcessId then
    Exit;

  // Windows 95, Windows 2000
  Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  if (Snapshot <> 0) and (Snapshot <> INVALID_HANDLE_VALUE) then
    try
      ModuleEntry.dwSize := SizeOf(TModuleEntry32);
      if Module32First(Snapshot, ModuleEntry) then
        Result := StrPas(ModuleEntry.szExePath);
    finally
      CloseHandle(Snapshot);
    end
  else
  begin
    // Windows NT 4.0
    Process := OpenProcess(DesiredAccess, False, ProcessId);
    if Process <> 0 then
      try
        if EnumProcessModules(Process, PDWORD(Addr(Module)), SizeOf(HMODULE),
          Needed) and (GetModuleFileNameEx(Process, Module, FileName,
          SizeOf(FileName)) > 0) then
          Result := StrPas(FileName);
      finally
        CloseHandle(Process);
      end;
  end;
end;
BTW, das Snapshot-Handle nur auf ungleich INVALID_HANDLE_VALUE abzufragen ist unsicher/falsch, da der Wrapper in der TlHelp32.pas 0 zurückgibt falls die API nicht vorhanden ist.

OrallY 5. Aug 2004 20:34

Re: Voller Pfad einer Anwendung anhand Handle
 
Danke für die vielen brauchbaren Antworten! Thx.

MathiasSimmack 6. Aug 2004 07:02

Re: Voller Pfad einer Anwendung anhand Handle
 
@Nico: Warum hast du nicht schon eher mal was gesagt? Ich bin der Meinung, Teile meines o.gp. (oben geposteten ;)) Codes stammen aus ohnehin deiner Feder.

mirage228 6. Aug 2004 07:45

Re: Voller Pfad einer Anwendung anhand Handle
 
Zitat:

Zitat von MathiasSimmack
@Nico: Warum hast du nicht schon eher mal was gesagt? Ich bin der Meinung, Teile meines o.gp. (oben geposteten ;)) Codes stammen aus ohnehin deiner Feder.

Hi,

Delphi hätte dir eigentlich ne Warnung ausgeben müssen, dass der Vergleich immer Wahr ergibt, da ein Cardinal (also THandle) immer ungleich -1 (INVALID_HANDLE_VALUE) ist. ;)

mfG
mirage228

NicoDE 6. Aug 2004 09:26

Re: Voller Pfad einer Anwendung anhand Handle
 
Zitat:

Zitat von MathiasSimmack
@Nico: Warum hast du nicht schon eher mal was gesagt? Ich bin der Meinung, Teile meines o.gp. (oben geposteten ;)) Codes stammen aus ohnehin deiner Feder.

Ich habe den Fehler früher selbst begangen :)

Zitat:

Zitat von mirage228
Delphi hätte dir eigentlich ne Warnung ausgeben müssen, dass der Vergleich immer Wahr ergibt, da ein Cardinal (also THandle) immer ungleich -1 (INVALID_HANDLE_VALUE) ist. ;)

Es wäre ziemlich sinnlos, wenn eine Konstante mit dem Namen INVALID_HANDLE_VALUE nicht mit THandle zuweisungskompatibel, bzw. vergleichbar wäre...

Gruss Nico

mirage228 6. Aug 2004 09:56

Re: Voller Pfad einer Anwendung anhand Handle
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von mirage228
Delphi hätte dir eigentlich ne Warnung ausgeben müssen, dass der Vergleich immer Wahr ergibt, da ein Cardinal (also THandle) immer ungleich -1 (INVALID_HANDLE_VALUE) ist. ;)

Es wäre ziemlich sinnlos, wenn eine Konstante mit dem Namen INVALID_HANDLE_VALUE nicht mit THandle zuweisungskompatibel, bzw. vergleichbar wäre...

Gruss Nico

Hm, ja, du hast Recht. :?

Hab grad ma nachgeschaut, und in Delphi7 ist INVALID_HANDLE_VALUE auch ein Cardinal (ehergesagt, -1 zu DWord gecastet), also ist ein Vergleich damit gültig.

mfG
mirage228

Unplugged 12. Sep 2004 08:15

Re: Voller Pfad einer Anwendung anhand Handle
 
Zitat:

Delphi-Quellcode:
      if Module32First(Snapshot, ModuleEntry) then
        Result := StrPas(ModuleEntry.szExePath);

Also ich schlage mich jetzt schon länger mit der Lösung von Luckie rum. Und zwar liefert szExeFile laut Definition einen Array. Ich bekomme aber immer nur die exe-datei selbst, ohne den Pfad zu ihr. Aber szExePath steht mir leider auch nicht zur Verfügung?

Edit: Ok es ist früh am morgen ^^ ein Blick in die tlhelp32.pas brachte die Erleuchtung zum szExePath.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 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