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 Process Pfad unter XP ermitteln (https://www.delphipraxis.net/5464-process-pfad-unter-xp-ermitteln.html)

Blacklotus 7. Jun 2003 12:16


Process Pfad unter XP ermitteln
 
Hallo bin neu hier und hab da mal ne Frage :D

Ich will den Pfad der explorer.exe ermitteln. Unter Win 9X,ME scheint das kein Problem zu sein aber unter Win2K,XP bekomme ich nur den Dateinamen zurück. Hier mal ein Code Schnipsel

Delphi-Quellcode:
var
   NTPID:TProcessrecs;
   win : HWND;
   tempString: array[0..255] of Char;
   i,j : Integer;
   ProcID   : DWord;
   SSHandle : THandle;
   Contin : boolean;
   ProcEntry : TProcessEntry32;
   temp:string;
   bWinNT:boolean;
begin        
Dir := '';
Version := '';
bWinNT := WinNT;

win := GetTopWindow(0);
     tempString := '';
     for i := 0 to 255 do begin
      win := GetNextWindow(win,GW_HWNDNEXT);
      GetWindowText(win, tempString, 255);
     if (Pos('EXPLORER', Uppercase(tempString)) = 0) then
     continue
      else
      begin  
      if GetOSName <> 'Windows NT' then begin
  GetWindowThreadProcessID(FindWindow(nil,tempstring), @ProcID);
  SSHandle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  ProcEntry.dwSize := Sizeof(ProcEntry);
  Contin := Process32First(SSHandle, ProcEntry);
  while Contin do begin
    if ProcEntry.th32ProcessID = ProcID then
    begin  
      Temp := Uppercase(ProcEntry.szExeFile)else
      if (Pos('EXPLORER',Temp) <>0) then
      if bWinNT then begin  
      Dir := '';
      Version := tempstring;
      result := ProcEntry.th32ProcessID;
      exit;
      end else
      begin  
      Dir := Extractfilepath(ProcEntry.szExeFile);
      Version := tempstring;
      result := ProcEntry.th32ProcessID;
Danke :)

sakura 7. Jun 2003 12:20

Versuch mal folgende Funktion, nicht getestet. Übergib der den ProcessHandle des Explorers.
Delphi-Quellcode:
function GetProcessPath(Handle: Cardinal): String; stdcall;
var
  TheFileName : array[0..MAX_PATH] of char;
begin
  FillChar(TheFileName, sizeof(TheFileName), #0);
  GetModuleFileName(Handle, TheFileName, sizeof(TheFileName));
  Result := TheFileName;
end;
...:cat:...

Blacklotus 7. Jun 2003 12:37

Danke sakura aber wenn ich das Handle des Fnsters übergebe bekomme ich einen leeren String zurück das selbe auch bei der PozessID oder was meinst du mit ProcessHandle?

Luckie 7. Jun 2003 12:40

Hol dir mit OpenProcess ein Handle auf das Object und dieses Handle übergibst du der Funktion von sakura.

Blacklotus 7. Jun 2003 12:58

@Luckie: Hast du das so gemeint? Weil so bekomme ich immer noch einen leeren String;

Path := GetProcessPath(OpenProcess(PROCESS_ALL_ACCESS,fals e,ProcEntry.th32ProcessID));

Luckie 7. Jun 2003 13:00

Eigentlich schon.

Christian Seehase 7. Jun 2003 13:01

Moin BlackLotus,

vielleicht solltest Du OpenProcess nicht direkt als Parameter übergeben, sondern erst mal sehen, ob Du überhaupt ein gültiges Prozess Handle zurück bekommst, und wenn nicht (=0) mit GetLastError überprüfen, was schiefgegangen ist.

Blacklotus 7. Jun 2003 13:11

Morgen Christian Seehase.

Das Prozess Handle ist nicht 0 sondern gültig (84) aber Sakuras
GetProcessPath funktion liefert trotzdem einen leeren string :wall:

Christian Seehase 7. Jun 2003 13:23

Moin BlackLotus,

stimmt, GetModuleFilename erwartet ja auch kein Prozess Handle.
Probiert hab' ich das nicht, aber vielleicht geht's ja so:

Mit dem Dateinamen den Du hast LoadLibraryEx mit LOAD_LIBRARY_AS_DATAFILE aufrufen, und das resultierende Handle dann an GetModuleFileName übergeben.

OpenProcess direkt als Parameter zu übergeben ist trotzdem keine gute Idee, denn Du musst das Handle ja mit CloseHandle wieder freigeben, was ein wenig schwierig wird, wenn Du es nicht hast. ;-)

Luckie 7. Jun 2003 13:30

Mit einem Module-Snapshot kommt man an den Exe-Pfad unter NT-basierenden Systemen ran.
Delphi-Quellcode:
    hSnapModule := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, pe32.th32ProcessID);
    if hSnapModule <> 0 then
    begin
      cntM := 0;
      ZeroMemory(@me32, sizeof(me32));
      me32.dwSize := sizeof(TModuleEntry32);
      if Module32First(hSnapModule, me32) = TRUE then
      begin
        FDetailsSingleProc.Path := me32.szExePath;
        while Module32Next(hSnapModule, me32) = TRUE do
        begin
          setlength(FDetailsSingleProc.Modules, cntM+1);
          FDetailsSingleProc.Modules[cntM] := me32.szExePath;
          Inc(cntM);
        end;
        FDetailsSingleProc.cntModules := cntM;
      end;
    end;
Ein Ausschnitt aus meiner SysInfo.

Blacklotus 7. Jun 2003 15:02

OK danke Luckie so geht es perfekt :hello:

Alexander 9. Jul 2003 11:16

Re: Process Pfad unter XP ermitteln
 
Ich habe da noch mal eine Frage zu.
Luckies Code funktioniert ja nur unter NT und der andere nur unter Win9x und ME, oder? (kann das jetzt nicht testen...habe nur Linux, Win2000 und XP rechner zu Hause)
Stimmt das so?

Motzi 9. Jul 2003 11:25

Re: Process Pfad unter XP ermitteln
 
Luckies Code funktioniert unter der gesamten 9x-Reihe und in der NT-Reihe ab 2k.

BTW: es gibt eine API GetModuleFileNameEx bei der man auch die Process-ID angeben kann... Sakuras Funktion müsste demnach so ausschaun:
Delphi-Quellcode:
function GetProcessPath(Handle: Cardinal): String; stdcall;
var
  TheFileName : array[0..MAX_PATH] of char;
begin
  FillChar(TheFileName, sizeof(TheFileName), #0);
  GetModuleFileNameEx(Handle, 0, TheFileName, sizeof(TheFileName));
  Result := TheFileName;
end;

Alexander 9. Jul 2003 11:51

Re: Process Pfad unter XP ermitteln
 
Ok, dann machen ich mir das einfach und vernachlässige Win NT.
Aber Luckie hat doch
Zitat:

Mit einem Module-Snapshot kommt man an den Exe-Pfad unter NT-basierenden Systemen ran.
geschireben, dachte, dass der Code ausschließlich unter NT-Systemen funktioniert...
und welcher Typ ist hsnapmodul?

Luckie 9. Jul 2003 16:11

Re: Process Pfad unter XP ermitteln
 
THandle oder auch einfach Cardinal. Und was das unter 98/ME liefert bin ich mir nicht so sicher. Funktionieren tut es, ja.

Alexander 10. Jul 2003 09:07

Re: Process Pfad unter XP ermitteln
 
arrg da hätte ich auch selbst drauf kommen können...Danke Luckie!


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