AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Process Pfad unter XP ermitteln

Ein Thema von Blacklotus · begonnen am 7. Jun 2003 · letzter Beitrag vom 10. Jul 2003
Antwort Antwort
Seite 1 von 2  1 2      
Blacklotus

Registriert seit: 7. Jun 2003
13 Beiträge
 
#1

Process Pfad unter XP ermitteln

  Alt 7. Jun 2003, 13:16
Hallo bin neu hier und hab da mal ne Frage

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 NTthen 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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 7. Jun 2003, 13: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;
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Blacklotus

Registriert seit: 7. Jun 2003
13 Beiträge
 
#3
  Alt 7. Jun 2003, 13: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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 7. Jun 2003, 13:40
Hol dir mit OpenProcess ein Handle auf das Object und dieses Handle übergibst du der Funktion von sakura.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Blacklotus

Registriert seit: 7. Jun 2003
13 Beiträge
 
#5
  Alt 7. Jun 2003, 13: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));
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 7. Jun 2003, 14:00
Eigentlich schon.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 7. Jun 2003, 14: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Blacklotus

Registriert seit: 7. Jun 2003
13 Beiträge
 
#8
  Alt 7. Jun 2003, 14:11
Morgen Christian Seehase.

Das Prozess Handle ist nicht 0 sondern gültig (84) aber Sakuras
GetProcessPath funktion liefert trotzdem einen leeren string
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 7. Jun 2003, 14: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 7. Jun 2003, 14: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 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