Anwendungspfad anhand der PID ermitteln

    • Offizieller Beitrag

    Hi,
    hier mal eine Möglichkeit mit der PID den Pfad der Anwendung zu ermitteln.
    Wird keine PID übergeben, gibt die Funktion den Pfad für die Anwendung des aktiven Fensters zurück.



    Edit: Es gibt ja kaum was, was nicht schon jemand getan hat ;(
    Habe gerade eine ähnliche Lösung (1 Monat alt) im EN-Forum gefunden. Link
    Naja, ich habs als Zweiter getan - der andere als Vorletzter. :rofl:

  • Sehr gut !!!!

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Hallo BugFix,


    habe eben leider einen kleinen Bug in deinem Skript gefunden...


    Wenn der Pfad z. B. für die Firefox.exe "C:\Program Files\Mozilla Firefox\firefox.exe" lautet, wird nur "Files\Mozilla Firefox\firefox.exe" zurückgeliefert...


    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

    • Offizieller Beitrag

    wird nur "Files\Mozilla Firefox\firefox.exe" zurückgeliefert...


    Kann ich nicht bestätigen.
    Habe mal diesen Ordner angelegt (im deutschen Windows gibt es den normalerweise ja nicht :P ) und ein dort hinkopiertes Programm gestartet.
    Ergebnis:

    Code
    C:\Program Files\TEST\PDFReader.exe
  • Komisch,


    ich habe jetzt 'mal eine Message Box für die Ausgabe gemacht und das Skript compiliert (also nicht über SciTE aufgerufen).


    MsgBox(0, "Pfad", _GetPathByPID()) anstelle von ConsoleWrite(_GetPathByPID() & @CRLF)


    Wenn ich jetzt keine PID in _GetPathByPID angebe und die EXE über die Kommandozeile starte erhalte ich die folgende Meldung:
    \system32\cmd.exe


    Gebe ich im Skript eine PID ein, so erhalte ich für FireFox wieder den im vorigen Post angegebenen Pfad.


    Windows XP MUL (englisch + deutsches Sprachpaket)
    SciTE 1.77
    AutoIt v3 Script : 3, 3, 0, 0


    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

  • Hallo BugFix.


    Da muß ich ihm recht geben. Sehe grade, das ich das gleiche Verzeichnis wie Du angelegt habe und ich dennoch "Program Files" nicht mit angezeigt bekomme.
    Wieso? Kann ich nicht sagen ;)

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Oscar.


    Stimmt, so klappt es auch mit dem Nachbarn ;)

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Ich hab bei mir folgenden ConsoleWrites eingefügt:
    $path = DllStructGetData($strPath, 'path')
    ConsoleWrite("!$path: " & $path & @CRLF)
    $DevicePath = StringRegExp($path, "\\Device\\\w*\\[\w\d\+\-()]*", 1)
    ConsoleWrite("!$DevicePath[0]: " & $DevicePath[0] & @CRLF)
    Ergebnis:

    Zitat

    !$path: \Device\HarddiskVolume3\Programme\AutoIt3\AutoIt3.exe
    !$DevicePath[0]: \Device\HarddiskVolume3\Programme
    \AutoIt3\AutoIt3.exe


    //Edit: mit dem RegExp funktioniert es:
    $DevicePath = StringRegExp($path, "\\Device\\\w*", 1)

    • Offizieller Beitrag

    Ich kann Dir ja mal die Ausgabe auf meinem Rechner beschreiben:


    Ohne die zusätzlichen Klammern:
    $DevicePath[0] = "\Device\HarddiskVolume3\Programme"
    Das Array $ret liefert in $ret[2] aber nur:
    "\Device\HarddiskVolume3"
    folglich trift die If-Bedingung nie zu und DeviceLetter ist ein Leerstring.


    Mit den zusätzlichen Klammern:
    $DevicePath[0] = "\Device\HarddiskVolume3"
    und der Rest funktioniert. :thumbup:

    • Offizieller Beitrag

    $DevicePath[0] = "\Device\HarddiskVolume3\Programme"


    Also das verwundert mich nun doch sehr. Eigentlich dürfte hier nicht im Klartext das Volume erscheinen (sonst hätte ich auch die Auswertung vereinfachen können).
    Meine Ausgabe sieht so aus:
    \Device\Harddisk0\DP(1)0x7e00-0x950280000+1


    Also scheint die Abfrage von irgendwelchen Windowseinstellungen beeinflußt zu werden. :S

    • Offizieller Beitrag

    Testprogramm:

    Local $lpTargetPath
    $ret = DllCall("kernel32.dll", "long", "QueryDosDevice", "str", "c:", "str", $lpTargetPath, "long", 256)
    ConsoleWrite($ret[2] & @CR)


    Die Ausgabe für meine CF-Karte (im Cardreader, über USB am Mainboard) sieht ähnlich aus:
    "\Device\Harddisk4\DP(1)0-0+a"


    Bei meinen 4 Festplatten kommt aber immer das Volume, z.B.:
    "\Device\HarddiskVolume4"

  • Werden vielleicht über SATA angeschlossene Geräte anders dargestellt als IDE und P-ATA ? Vielleicht macht da Windows einen Unterschied.

  • Ich habe mal das daraus gebastelt:

    • Offizieller Beitrag

    Hm ich verfluche Vista und Konsorten .


    Da hat BugFix so eine schöne Funktion geschrieben und sie funzt nicht richtig auf Vista .
    Bin gerade dabei einen Taskmanager zu progen und könnte die Funk gut gebrauchen .
    Wenn ich anhand der PID , die ich aus der ProcessList habe den Pfad ermitteln möchte klappt das nicht .


    Dieser Teil des Codes:
    $hProcess = _WinAPI_OpenProcess(0x00000400, True, $PID, True) liefert mir des öfteren eine WinApi fehlermeldung:


    _WinApi_OpenProcessPriviliged: Zugriff verweigert


    Habe das versucht mit
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', 0x00000410, 'int', 0, 'int', $PID); Modifiziert
    $hProcess = $aProc[0]
    zu umgehen , aber es klappt nur insoweit, das der fehler nicht angezeigt wird und folglich das Script nicht abstürzt .


    Soweit ich das jetzt recherchiert habe liegt es an der UAC von Vista . Die Funktion OpenProcess funktioniert nur mit einschränkungen.
    Hat irgendwer eine Idee wie ich sonst zum Pfad komme ? Hab mir im Englisch Forum schon eine Wolf gesucht ;(


    BugFix habe sogar 3 weiter Funktionen so ähnlich wie deine gefunden . Deine gefällt mir aber am besten , und liefert mir nach meiner mod. die meisten Ergebnisse :D



    Post 1200 :rock:


    Edit: Hier mal die modifizierte Version von _GetPathByPID:

  • Und mit @RequireAdmin?
    Ansonsten versuchs mal mit dieser (ungetestet - hab gerade kein AutoIt zur Hand):

    Ansonsten mal eine Variante ohne OpenProcess (ebenfalls ungetestet):


    Allerdings ist die 2. Funktion logischerweise deutlich langsamer als die 1.

    • Offizieller Beitrag

    AspirinJunkie.


    Dein 1. Beispiel ist superschnell und gibt zahlreiche treffer aus . Dein 2. Beispiel ist am besten hat aber den Nachteil , das es absolut langsam ist . Ich werd eventuell beides kombinieren und mal sehen ob ich es damit hinbekomme. Dank dir