Lösung gesucht: wie sämtliche Dateitypen starten?

  • Hiho,

    ich arbeite an einem Tool, welches als Multi-Starter verwendet werden soll.
    Man soll hierrüber also alle möglichen Dateien starten können (exe, bat, jpg, pdf) ... doch leider erweist sich der Aufruf von diesen Dateien als komplizierter als Gedacht.

    Ich habe zur Ausführung den kompletten Pfad.

    Ich hatte es so, aber das funktioniert auch nicht überall:

    [autoit]

    If $PS[7] = "exe" Then
    Run($PS[0], "")
    Else
    ShellExecute($PS[0])
    EndIf

    [/autoit]

    Hat jmd ne Idee, wie man das generell für alle Dateien sicherstellen kann (vorausgesetzt natürlich, bei pdf, jpg usw sind programme mit der Dateiendung verknüpft?

  • Ich hab dir mal nen Beispiel gemacht (bei mehreren dateiendungen würde ich Switch case DATEIENDUNG1 ... case DATEIENDUNG2 ...etc... Endswitch empfehlen)

    Beispiel für .exe:

    [autoit]

    ; 2 Methoden sind möglich (wobei methode 2 warscheinlich länger dauert und vom prinzip gleich ist, aber durch isarray schonmal "falsche" eingaben wegfallen lässt)

    [/autoit][autoit][/autoit][autoit]

    ;Methode 1:
    $dPfad = "C:\Users\USERNAME\Desktop\Sudoku.exe"
    If StringUpper(StringRight($dPfad, 4)) = StringUpper(".exe") Then
    ShellExecute($dPfad)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;Methode 2:
    #include <string.au3>
    $dPfad = "C:\Users\USERNAME\Desktop\Sudoku.exe"
    $sSplit = StringSplit($dPfad, "\")
    If IsArray($sSplit) = True Then
    If StringUpper(StringRight($sSplit[$sSplit[0]], 4)) = StringUpper(".exe") Then
    ShellExecute($dPfad)
    EndIf
    EndIf

    [/autoit]


    PS: eigentlich sollte per Shellexecute immer das standard programm gewählt werden

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Hi,
    also ich habe in mehreren meiner Scripte keine Probleme mit Shellexecute()
    Präzisiere mal:

    Zitat

    funktioniert auch nicht überall:


    Teste folgendes mit verschiedenen "problematischen" Dateiendungen

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $ext = InputBox("Leere Eingabe=ENDE", "Dateiendung eingeben:")
    If $ext = "" Then Exit
    FileOpen("test." & $ext, 2)
    $Exec = FindExecutable("test." & $ext)
    if $exec=@scriptdir&"\test." & $ext or $exec="" then $exec="keinem Programm"
    MsgBox(0, 0, "Die Dateiendung " & $ext & " ist verknüpft mit:" & @CRLF & "DLL-Call: "&$Exec&@crlf&"Registry: "&findpathtoprog($ext))
    FileDelete("test." & $ext)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func FindExecutable($cFile)
    Local $hDLL = DllOpen("shell32.dll"), $cPath, $cFDrive, $cFDir, $cFName, $cFExt
    _PathSplit($cPath, $cFDrive, $cFDir, $cFName, $cFExt)
    Local $structEXE = DllStructCreate("char[260]")
    Local $avResult = DllCall($hDLL, "int", "FindExecutableA", "str", $cFile, "str", $cPath, "ptr", DllStructGetPtr($structEXE))
    DllClose($hDLL)
    Return SetError(@error, 0, DllStructGetData($structEXE, 1))
    EndFunc ;==>FindExecutable

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func FindPathToProg($ext) ;findet den vollen Pfad zum Standardbrowser
    Local $RegLocation = RegRead("HKEY_CLASSES_ROOT\" & "."&$ext, "")
    Local $RegLoc = RegRead("HKEY_CLASSES_ROOT\" & $RegLocation & "\Shell\Open\command", "")
    $RegLoc = StringMid($RegLoc, 2, StringInStr($RegLoc, '"', 0, 2) - 2)
    Return SetError(@error, 0, $RegLoc)
    EndFunc ;==>FindPathToDefaultBrowser

    [/autoit]


    Ich weiss nicht WIE shellexecute die Verknüpfung bestimmt, aber das o.g. Script (dll-call) findet bei einem Browserwechsel die Verknüpfung zum neuen Standardbrowser nicht, aber shellexecute bzw die Registrysuche schon....

    ciao
    Andy