![]() |
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:
Danke :)
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; |
Versuch mal folgende Funktion, nicht getestet. Übergib der den ProcessHandle des Explorers.
Delphi-Quellcode:
...:cat:...
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; |
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?
|
Hol dir mit OpenProcess ein Handle auf das Object und dieses Handle übergibst du der Funktion von sakura.
|
@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)); |
Eigentlich schon.
|
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. |
Morgen Christian Seehase.
Das Prozess Handle ist nicht 0 sondern gültig (84) aber Sakuras GetProcessPath funktion liefert trotzdem einen leeren string :wall: |
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. ;-) |
Mit einem Module-Snapshot kommt man an den Exe-Pfad unter NT-basierenden Systemen ran.
Delphi-Quellcode:
Ein Ausschnitt aus meiner SysInfo.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 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