![]() |
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; |
OK danke Luckie so geht es perfekt :hello:
|
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? |
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; |
Re: Process Pfad unter XP ermitteln
Ok, dann machen ich mir das einfach und vernachlässige Win NT.
Aber Luckie hat doch Zitat:
und welcher Typ ist hsnapmodul? |
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.
|
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 00:24 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