Shellexecute kann Grafikdatei wegen fehlendem Programm nicht starten

  • Hi alle zusammen,

    ich versuche mit folgendem Code eine Grafikdatei zu öffnen:

    Code
    $sShellvar = ShellExecute($Logfile) ; Logfile ist ein zuvor erzeugter Screenshot!

    Unter Windows 10 alles gut.

    Wenn ich nun mein Programm unter WinPE laufen lasse, wird der Screenshot erzeugt. ShellExecute wirft dann aber(natürlich) eine Fehlermeldung aus, dass es kein
    assoziiertes Programm gibt und die Datei nicht zu öffnen ist. Das Problem: Ich bestätige die Windows-Fehlermeldung, diese verschwindet und mein Proggi macht nicht mehr weiter,
    bzw. es wartet auf i-was, denn nach ca. 30 min macht es plötzlich weiter. Gibt es eine Möglichkeit z.B. den Shellexecute-Prozess zu killen, wenn $sShellvar auf 0 gesetzt wird?

  • Schau mal in die Hilfe: https://www.autoitscript.com/autoit3/docs/f…hellExecute.htm

    Dort findest du worauf du nach Shellexecute prüfen musst (error handling).

    Besser wäre es jedoch deinen Fehler zu korrigieren anstatt ihn zu umschiffen.

    Z.B. ein Festes Programm anzugeben mit dem die Datei geöffnet werden soll (ob es das überhaupt gibt kannst du dann vorher auch prüfen) und dann wie es normalerweise ist, das Bild als Parameter mit zu geben.

    Wie wäre es mit mehr (oder dem ganzen) Code und mehr Infos? Was für eine Grafikdatei soll mit welchem Programm geöffnet werden? Wie wird der Screenshot erzeugt und wo wird er abgelegt?

  • Hallo Mombas,

    in der Hilfe von Shellexecute steht ja nur der Rückgabewert, nicht aber wie man die Shellexecute API selbst stoppen kann wenn sie auf Fehler läuft. In unserer WinPE-Umgebung gibt es kein Programm mit dem
    man den erzeugten Screenshot(*.png-File im selben Verzeichnis wie das Autoit-Proggi) öffnen könnte. Im Übrigen lässt Shellexecute nicht-ausführbare Dateien mit dem dazu assoziierten Programm öffnen, dass es unter WINPE aber eben nicht gibt und auch nicht geben wird(gem unserem zuständigen Admin!).

    Sollte es also kein Errorhandling geben, dass den "Shellexecute-Prozess" selbst stoppen kann, werde ich mein Proggi daraufhin ändern, dass es die OS-Umgebung abfragt und dann Shellexecute an dieser Stelle nicht ausführt.

    Danke trotzdem für die Hilfe.

  • Warum rufst du nicht einfach das Standard Programm auf (Windows Bildanzeige o.ä.) und gibst den Parameter mit?

    Dann weißt du was du killen musst.

    Bei einem Rückgabewert von "0" oder @error <> 0 weißt du das der Aufruf nicht erfolgreich war. (Error Handling)

    Das über die OS-Erkennung zu machen geht aber im Zweifel natürlich auch und scheint in diesem Fall die bessere Wahl zu sein (kenne mich mit WinPE nicht aus).

  • In unserer WinPE-Umgebung gibt es kein Programm mit dem
    man den erzeugten Screenshot(*.png-File im selben Verzeichnis wie das Autoit-Proggi) öffnen könnte. Im Übrigen lässt Shellexecute nicht-ausführbare Dateien mit dem dazu assoziierten Programm öffnen, dass es unter WINPE aber eben nicht gibt und auch nicht geben wird(gem unserem zuständigen Admin!).

    Wenn das AutoIt-Script laufen darf, warum zeigst Du den Screenshot nicht damit an?

    Edit:

    Hier mal ein Beispiel:

  • Hallo Oscar,

    verzeihe bitte das späte Feedback und vielen lieben Dank für die großartige Idee. Diese (naheliegendste)Möglichkeit
    hatte ich gar nicht auf dem Schirm. Ich werde das demnächst testen und hier eine Antwort einstellen.

    Das Wochenende fängt damit ja schon richtig super an. :part::theke::party:

  • Hallo Oscar,

    ich bin gerade dabei deinen Vorschlag, Die Grafikdatei mit Autoit selbst anzuzeigen zu testen. Also Grafik erzeugen und diese anzeigen funktioniert,
    Jedoch hängt dann mein Programm. Der Ablauf bisher war so: Erzeugung Screenshot -> Anzeige Screenshot mittels Shellexecute -> Wenn Bild geladen
    Einblendung MsgBox ob der nächste Screenshot gemacht werden soll.

    Nachdem ich nun anstatt mit Shellexecute, dass Bild per Funktionsaufruf anzeige kommt die MsgBox nicht mehr. Schließe ich die ScreenshotGui wird die Msgbox angezeigt.
    Da ich nach der Bestätigung der MsgBox noch einen HTML-Report erzeugen möchte wäre es schön wenn die Msgbox angezeigt werden würde,
    Hängt das vielleicht mit der Hauptform zusammen?

    Auszug Code:

  • Hängt das vielleicht mit der Hauptform zusammen?

    Nein.

    Beim Aufruf der Funktion Graphicview hängst du dort in der While-Schleife fest, bis die GUI wieder geschlossen wurde... erst danach kann die MsBox angezeigt werden.

    Da du die relevanten Variablen ($g_hGUI, $g_hGraphic, $g_hImage) eh alle als Global innerhalb der Funktion (sollte man möglichst vermeiden!!!) deklariert hast, verlege die Aufräumarbeiten einfach in die aufrufende Funktion und lass die While-Schleife weg. Deine MsBox fungiert dann quasi als While-Schleife... und sobald die geschlossen wurde und du deinen Report erzeugt hast, kannst du aufräumen.

    _GDIPlus_Startup() sollte besser ausgeführt werden, wenn dein Script gestartet wird, und _GDIPlus_Shutdown() wenn es beendet wird... und nicht bei jedem Funktionsaufruf.

    So macht man das besser:

    AutoIt
    #include <GDIPlus.au3>
    
    _GDIPlus_Startup()
    OnAutoItExitRegister('_Exit')
    
    ; mach irgendwas...
    
    Func _Exit()
        _GDIPlus_Shutdown()
    EndFunc

    Sleep()... einige davon sind überflüssig.

  • Hallo!

    Nachdem ich mich schon sehr viel mit WinPE beschäftigt haben (deployment von OS) kann ich Dir zwei Dinge dazu sagen:

    1.) Es gibt keinen Bildbetrachter unter WinPE (wozu auch)...Du solltest die die Grafik an ein Programm übergeben. Ein einfaches (älters) Portable-APP dafür verwenden. Damit hast die immer noch die besten Chancen das es funktioniert!

    2.) GDI oder auch GDI+ wird mit hoher wahrscheinlichkeit nicht funktionieren. Unter WinPE fehlen zu viele Schnittstellen und das halbe Windows das aber viele Programme vorraussetzen.

    Ich weiß zwar nicht ganz was Du in einem PreEvenementen für Bilder anzeigen lassen willst, aber vielleicht kommst Du in Deinem Projekt weiter wenn Du das PE mit Winbuilder etwas "aufbohrst". Dann hättetst Du auch unter 64Bit eine 32Bit-Umgebung...

    lg

    Racer

  • Hallo Oscar,

    ich habe eben deinen Vorschlag umgesetzt. Was soll ich sagen: DAS PROGGI FUNZT PERFEKT :part:  :party::party::party:

    Vielen Lieben Dank für deine Hilfestellung. Möge deine gute Tat mit reichlich Kindersegen, einer extrem guten Rente und immer währender Gesundheit vergolten werden :klatschen::klatschen::rofl:

    @ Racer: ich muss dir widersprechen 8) Mein Test in unserem Win-PE hat einwandfrei funktioniert. Die Intention die Grafikdatei(selbst erstellter Screenshot) per Autoit anzuzeigen lag ja genau darin,
    dass es in WIN-PE und ab und zu auch auf ganz neuen Rechnern kein assoziiertes Grafikprogramm gibt. Offenbar ist unser WIN-PE mit den relevanten Schnittstellen bereits entsprechend "aufgebohrt".

    Auf jeden Fall ist das Problem gelöst.

  • [Off-Topic]

    Da das Problem ja offenbar gelöst ist, konnte ich mir den Spaß nicht verkneifen :

    Hallo Oscar,

    [...] Möge deine gute Tat mit reichlich Kindersegen, einer extrem guten Rente und immer währender Gesundheit vergolten werden :klatschen::klatschen::rofl:

    Dass mit dem Kindersegen hatten wir bereits in einem Thread von 2017.

    Mir kam sofort wieder die Antwort von water in den Sinn ^^ :

    Zitat

    ... ist in Ordnung , vor Kindersegen mögen mich die edlen Produkte der Firma Durex schützen ;)

    Möglicherweise verfolgt Oscar diesbezüglich aber eine andere Strategie ;) .

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."