os.execute or io.popen on windows without console flashing

  • Im Thread hier kam das Thema der Änderungen in Lua auf, die in der derzeitigen SciTE4AutoIt3 Version verhindern, dass man DLLs einbinden kann. Dadurch fallen wichtige Funktionen weg, die man z.B. mit der shell.dll nutzen konnte.

    Nutzbare Funktionen in der shell.dll: exec, fileexists, findfiles, from_utf8, getclipboardtext, getfileattr, inputbox, msgbox, setfileattr, to_utf8

    shell.exec ist sicher die am häufigsten genutzte... das ist ein guter Ersatz für os.execute ...weil bei shell.exec kein DOS--Fenster aufpoppt.

    Nun habe ich die halbe Nacht recherchiert, ob das nicht doch geht. Dabei bin ich auf einen Lichtblick gestoßen, der vielleicht das Aufblitzen des DOS-Fenster behebt. Da meine Englisch-Kenntnisse ein wenig bescheiden sind, könnt ihr in folgenden Links lesen, ob ich das richtig verstanden habe.

    Um die entsprechenden Stellen schneller zu finden, als Suchbegriff "os.execute" verwenden.

    Da dieser Punkt auch in den neueren Standardversionen von SciTE fehlt, sieht Jos offenbar keinen Anlass diesbzgl. tätig zu werden (ggf. kann er es auch nicht :/ ).

    Das Einbinden von DLLs wird hier zwar nicht erwähnt, aber falls ich die Infos richtig verstanden habe, könnte Jos nun mit der neuen Version von SciTE eine neue Version von SciTE4AutoIt3 erstellen, in der bei os.execute kein DOS-Fenster mehr aufpoppt. Das wär doch was, oder? :thumbup:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    könnte Jos nun mit der neuen Version von SciTE eine neue Version von SciTE4AutoIt3 erstellen, in der bei os.execute kein DOS-Fenster mehr aufpoppt. Das wär doch was, oder?

    Ja, so sieht es aus.

    Jedoch ist das zwar ein Übel, aber eindeutig das geringste.

    Die Unmöglichkeit Dll's einzubinden ist das weitaus größere Problem.

  • Die Unmöglichkeit Dll's einzubinden ist das weitaus größere Problem.

    Hm, wenn ich es richtig verstanden habe, dann geht das in der neuen Version mit luaL_setfuncs. Somit ist es ja möglich... nur eben nicht mehr die "veralteten" Dlls, welche luaL_register benötigen.

    Genau betrachtet ist es hauptsächlich sehr ärgerlich, dass der Support für diverse Lua-Dlls unter aller Sau ist. <X

    • Offizieller Beitrag

    Genau betrachtet ist es hauptsächlich sehr ärgerlich, dass der Support für diverse Lua-Dlls unter aller Sau ist.

    Leider wahr.

    Schade, dass @progandy nicht mehr an Bord ist. Er hatte damals einige Lua-Dll für SciTE verfügbar gemacht.

    Für LUA gibt es einige praktische Erweiterungen als DLL, die jedoch nicht mit der in SciTE integrierten Version funktionieren.
    SciTE verwendet LUA 5.1 und exportiert die nötigen Funktionen auch in der SciTE.exe. Die DLLs erwarten dagegen die Exports durch eine DLL namens lua5.1.dll.

    Ich habe mir zwar die Dll (original für Lua und angepasste für SciTE-Lua) im Hex-Editor angeschaut, auf der Suche nach dieser Einstellung - leider ohne Erfolg.

    Sein Wissen in diesem Bereich hätte uns vielleicht hier auch nutzen können.

  • Ich habe mir gerade mal die pure Version von SciTE (aktuell Version 4.4.5) installiert und getestet, ob das Flashen tatsächlich weg ist.

    Also entweder mache ich was falsch, oder es geht doch noch nicht.

    Zum Testen habe ich es so gemacht:

    • Im normalen SciTE Ordner die SciTE.exe umbenannt.
    • Die SciTE32.exe aus der Standard-Version umbenannt zu SciTE.exe und in den normalen SciTE Ordner kopiert.
    • Die Scintilla.dll aus der Standard-Version in den normalen SciTE Ordner dazukopiert.
    • create.hidden.console=1 In der SciTEGlobal.properties oder in der SciTEUser.properties hinzugefügt.
    • Einen Test-Eintrag in die SciTEStartup.lua eingefügt. os.execute('F:\\AutoIt\\TestOrdner\\Hallo_Welt.exe')
    • Alle SciTE-Fenster schließen und SciTE erneut starten.

    Unter Win 7 blitzt das DOS-Fenster beim Starten von SciTE, unter Win 10 wird das Aufblitzen "verschluckt". Unter beiden Windows' ist das Aufblitzen nun weg, wenn SciTE läuft. Beim nächsten Öffnen von SciTE blitzt es wieder je 1x.

    Ich habe mal hier angefragt.

    BugFix Dein Link geht zu einer Anmeldung mit Google-Konto, das ich nicht habe. Kannst du das anders verlinken?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Nun gut, das Flashen ist weg -

    Welches Windows hast du für die Tests benutzt? Ist auch das Blitzen beim ersten Start von os.execute weg? Hast du os.execute in der SciTEStartup.lua getestet und/oder per Shortcut aufgerufen? Wenn du ein neues Fenster von SciTE oder einen neuen Tab in SciTE öffnest, erscheint dann das DOS-Fenster jeweils ein weiteres Mal?

    Nun gut, das Flashen ist weg - aber das ist ja nur die Kosmetik gewesen, das Basisproblem bleibt.

    Nicht nur das, ich finde create.hidden.console=1 unbefriedigend. Unter Win 7 blitzt das DOS-Fenster bei jedem Öffnen eines SciTE Fenster erneut auf, evtl. auch nach dem Öffnen einen neuen SciTE-Fensters bei jedem ersten Ausführen von os.execute/io.popen per Shortcut, was ich nicht getestet habe. Um das Blitzen zu verhindern erstellt SciTE ein unsichtbares DOS-Fenster. Das muss ja erstmal selbst gestartet werden und blitzt halt bei jedem "Erst-Erstellen" auf und ist (zumindest unter Win 7) deutlich wahrnehmbar.

    Ehrlich, ich verstehe nicht, wieso SciTE nicht den Windows Explorer für io.popen benutzt! Der Windows Explorer ist die eigentliche Shell von Windows und kann Programme problemlos ohne DOS-Fenster-Blitzen starten! Ich weiß, dass SciTE mehrere Plattformen unterstützt, aber festzustellen, ob SciTE auf Windows ausgeführt wird, sollte doch kein Hexenwerk sein und soweit ich verstanden habe ist io.popen doch Plattform-spezifisch, oder?

    Wie dem auch sei, abgesehen von dieser unbefriedigenden Kosmetik bleibt das Basisproblem, dass es derzeit nicht möglich ist, in Lua DLLs einzubinden. Um das anzugehen, bleibt wohl nur eine Anfrage bei Neil Hodgson zu stellen. BugFix hat das am 2019-01-21 schonmal gemacht. Leider verlief die Anfrage im Sand.

    Da das Problem (DLLs einbinden) ein anderes Thema ist, werde ich einen anderen Thread dafür einrichten.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.