Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 Uhr.
Seite 1 von 2  1 2      

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