Kommunikation zw AutoIt und PSPad's VBScript

  • Ich brauche eine Kommunikation zwischen einem AutoIt-Script und dem VBScript-Script von PSPad. Genauer gesagt, sollen im laufenden PSPad verschiedene VBScript-Funktionen von außen per AutoIt aufgerufen werden können, die dann auf interne Informationen von PSPad zugreifen.


    Es soll eine isolierte*, stabile Kommunikation sein, mit der auch Parameter übergeben werden können. (* isoliert = kein Senden von Hotkeys, die den normalen Ablauf stören können, weil auch Intervall-Aufgaben möglich sein sollen, z.B. alle 50ms). Versucht habe ich schon einiges, aber ich habe leider null Ahnung und es war nur ein wahlloses Herrumstochern.


    Wichtig: In VBScript gibt es keine Timer, die in Intervallen Events schicken und wegen Limitierungen durch PSPad sind keine Schleifen möglich, die ständig laufen.


    Eine solcher Kommunikation ist notwendig, weil ich das PSPad4AutoIt3 Projekt ansonsten nicht weiterentwickeln kann. Kann mir jemand helfen?


    Wer seine Ideen testen möchte, kann PSPad downloden von der offiziellen Webseite. Im Pfad "PSPad4AutoIt3\Script\VBScript\" sind VBScripts enthalten, mit Funktionen zum Testen. Die WSH-Unterstützung muss eingeschaltet werden unter PSPad-Hauptmenü / Settings / Program Settings / System integration:


  • Professor Bernd

    Hat den Titel des Themas von „Möglichkeit gesucht zur Kommunikation zw AutoIt und PSPad's VBScript“ zu „Kommunikation zw AutoIt und PSPad's VBScript“ geändert.
  • Tja... ist dann wohl doch nix mit testen...


    SciTE - bzw. lediglich die SciTE.exe, da der Rest aktuell ist - wird bei mir erst dann aktualisiert, wenn die neue Version wieder den Prozedureinsprungpunkt luaL_register enthält, da sonst einige Lua-Scripts bei mir nicht mehr laufen... hauptsächlich weil shell = require "shell" dann nicht mehr funktioniert.


    Von wem und wofür kommt die Meldung wegen Internet?


  • Eine solcher Kommunikation

    2:1 for me ;-)

    You win! :)


    Fehlermeldung SciTE Minversion: Kannst du mal testen, ob die Update-Version 1.2.0 läuft? PSPad4AutoIt3 v1.2.0 beta - Update.zip downloaden, entpacken und über vorhandene Dateien im PSPad4AutoIt3 Ordner kopieren. (In der Update-Version wird nicht mehr die SciTE.exe geprüft, sondern die AutoIt3Wrapper.au3.) Falls das nicht funktioniert, kannst du eine normale PSPad Version von der PSPad Seite runterladen.


    Von wem und wofür kommt die Meldung wegen Internet?

    Das ist ein Update-Hinweis von PSPad. Zum abschalten: PSPad-Hauptmenü / Settings / Program Settings / Update => Häkchen entfernen.


    Zum eigentlichen Thema:


    Deine Links habe ich überflogen, aber ich befürchte, dass ich entweder nicht genug davon verstehe, oder die dort genannten Möglichkeiten eine ständiges Senden vom VBScript benötigen. Ich kann es nicht gut erklären, aber in VBScript sind leider keine Timer möglich und Schleifen können in diesem Fall nicht ständig laufen, weil sie PSPad lahmlegen und unter verschiedenen Umständen in PSPad Fehler erzeugen. Genau das ist das Problem, weshalb ich nach einer (anderen) Kommunikationsmöglichkeit suche.

  • Ja ok... jetzt funktioniert es... aber da muss schon ein achtes Weltwunder passieren, damit ich von SciTE4AutoIt3 nach PSPad wechsle... allein schon wegen Lua...


    Ich habe es aber auf Anhieb geschafft ein Script zu starten/kompilieren. ;-)

  • Ja ok... jetzt funktioniert es... aber da muss schon ein achtes Weltwunder passieren, damit ich von SciTE4AutoIt3 nach PSPad wechsle... allein schon wegen Lua...

    Nimm dir trotzem die paar Minuten Zeit um es mal richtig auszutesten.


    Anfänglich war ich von PSPad auch schockiert (die Installationsroutine ist auch etwas optimierbar), aber glücklicherweise kann man die Oberfläche ähnlich zu SciTE gestalten.

    Da ich persönlich keine Lua-Skripte nutze (und auch keinen Sinn darin sehe) muss man sich nur an einigen Stellen umgewöhnen.


    Der Calltipviewer (auch wenn er im Moment leider nicht automatisch erscheint) ist einfach dem von SciTE zweifellos überlegen, und dass eigene Funktionen auch geparst werden ist einfach nur der Hammer.

    Man weiß gar nicht, was man in SciTE alles vermisst, weil man es nie gekannt hat.

  • Wenn dir das schon gefallen hat, probier mal den von alpines genannten CallTipViewer für OUDFs.

    Habe ich soeben gemacht... ok... SciTE kann das ja auch... bei deinem wird der CallTip allerdings nicht auf demselben Monitor angezeigt.


    Aber ohne eine Kommunikation, mit der im laufenden PSPad eine VBScript Funktion aufgerufen werden kann, ist bald das Ende der Fahnenstange erreicht.

    Erkläre das bitte mal anhand eines konkreten Beispiels... ich raffe das nicht so ganz... und wie würdest du es denn z.B. mit AutoIt machen?


       


    PS: $hWndOwnder ist übrigens ausnahmsweise mal nicht mein Fehler, denn es ist bereits in der originalen Funktion _ChooseColor falsch geschrieben... werde es bei mir aber korrigieren.


  • Aber jetzt wieder zurück zum eigentlichen Thema.

    Aber ohne eine Kommunikation, mit der im laufenden PSPad eine VBScript Funktion aufgerufen werden kann, ist bald das Ende der Fahnenstange erreicht. :(

    Erkläre das bitte mal anhand eines konkreten Beispiels... ich raffe das nicht so ganz... und wie würdest du es denn z.B. mit AutoIt machen?

    Ich bin froh, dass du das fragst. :thumbup:Es ist nicht einfach zu erklären.


    PSPad hat als einzige Schnittstellen nach außen JavaScript und VBScript. (Ich benutze VBScript in meinem Projekt.) Beide haben keine Browser-"Grundlage", sind also in ihrer Funktionalität extrem beschränkt (WSH).


    Der Autor von PSPad hat eine Funktionalität in PSPad eingebaut, mit der per VBScript auf interne Informationen von PSPad zugegriffen und interne Funktionen gesteuert werden können. Das sind wirklich sehr viele Informationen, von der Caret-Pos über den Zeilen-Text, Wort am Cursor, bishin zu Fehlerzeilen im Consolen-Fenster. Und man kann damit unglaublich viele Funktionen von PSPad steuern, auch Menüfunktionen, oder laden und speichern von Scripten, Projekt-Verwaltung, suchen und ersetzen und und und.


    Nun habe ich verschiedene Funktionen als VBScripts umgesetzt. Wenn PSPad läuft und es wird z.B. ein Tastatur-Shortcut gedrückt, wird eine meiner Funktionen gestartet, die dann ein Au3 Script aufruft => dann wird z.B. ein Kompiliervorgang gestartet.


    Leider geht das nur in eine Richtung: Vom internen VBScript zum externen Au3 Script. Was ich brauche ist eine Möglichkeit für den umgekehrten Weg: Ein Au3 Script soll eine Funktion im PSPad-internen VBScript aufrufen.


    Beispiel: PSPad läuft und ein XY.au3 will das Zeichen wissen, an der das Caret in PSPad gerade steht. Angenommen im VBScript habe ich z.B. eine Funktion GetCharAtCaretPos() geschrieben, die mir die gewünschten Informationen an das XY.au3 senden kann. Was nun fehlt ist eine Möglichkeit, mit der das XY.au3 die Funktion GetCharAtCaretPos() aufrufen kann, damit die gewünschten Informatioen ans XY.au3 gesendet werden.


  • Was nun fehlt ist eine Möglichkeit, mit der das XY.au3 die Funktion GetCharAtCaretPos() aufrufen kann, damit die gewünschten Informatioen ans XY.au3 gesendet werden.

    Verstehe... genau das wird in SciTe mit Lua und dem Director Interface ermöglicht.


    Wenn PSPad keine solche Mechanismen zur Verfügung stellt, muss es ja wohl oder übel eines deiner VBScripte machen, dass dafür dann einen (Timer-)Event braucht, oder in einer Endlosschleife laufen muss, um das zu händeln.


    Endlosschleife fällt ja weg, weil PSPad damit verständlicherweise nicht klar kommt... wie sieht es also mit Events aus... gibt es da irgendwas verwertbares?

  • Dann benutzt du nicht SciTE4AutoIt?

    Die gesamte Funktionalität dort wird mit Lua-Skripten realisiert.

    Im "normalen" SciTE doch auch, oder?


    Ich habe mindestens 20 Lua-Scripte für mein SciTE... gut die Hälfte von BugFix ...einige werden per Hotkey gestartet, andere wenn ein Event ausgelöst wird, z.B. wenn ein Script gespeichert wird.


    Disabling Lua

    Lua is currently loaded just-in-time, before it is first used. The ways that Lua can become are through the ext.lua.startup.script property, by naming a lua file named in the extension.filepattern property, or by using the extension mechanism to define tool commands (i.e. subsystem 3). If you do not do any of these things, the Lua scripting engine is not loaded, and for all practical purposes, SciTE should behave as it did before Lua was added.


    Nevertheless, it is still possible to build SciTE without the Lua support. To do this, simply define the variable NO_LUA when you build it, e.g. for MSVC, nmake -f scite.mak -DNO_LUA; or with GNU tools, make NO_LUA=1.

  • Dann benutzt du nicht SciTE4AutoIt?

    Die gesamte Funktionalität dort wird mit Lua-Skripten realisiert. Bitnugger oder ich nutzen darüber hinaus nur weitere Möglichkeiten. Aber ohne Lua würde SciTE nicht funktionieren.

    Vielleicht habe ich mich unglücklich ausgedrückt: Das sehe ich nicht explizit als Lua-Skripte an, da sich Berns Tool ja auch die SciTE4AutoIt zu nutze macht (auch wenn es nicht die Lua-Skripte sind).

    Mir ging es im speziellen darum, weitere Skripte zu verwenden, die über SciTe4AutoIt hinaus gehen.


    Habe ich soeben gemacht... ok... SciTE kann das ja auch... bei deinem wird der CallTip allerdings nicht auf demselben Monitor angezeigt.

    Und wie kriege ich das bei SciTE hin ohne weitere Skripte zu installieren? Das wäre mir neu, wenn es SciTE kann.

  • Und wie kriege ich das bei SciTE hin ohne weitere Skripte zu installieren?

    Nicht das wir aneinander vorbeireden...


    Damit in SciTE für eigene Funktionen ein CallTip angezeigt wird, müssen diese lediglich mit dem CallTip-Manager eingepflegt werden. Der CallTip-Manager wird in der SciteConfig.au3 gestartet, in der dann die Funktion CallTipManager() aufgerufen wird, die sich in UCTMan.au3 versteckt, welche mit #include "UCTMan.au3" geladen wird. Diese Sachen sind aber alle bereits in SciTE4AutoIt3 enthalten.


    Ansonsten gib mal ein Beispiel...

  • Leider nicht. Wie gesagt, es gibt keine Browser-"Grundlage", somit keine Fenster, somit keine Events.

    Somit benötigst du ein eigenes Kommunikations-Interface in PSPad. Ich bin nicht firm in VBScript, somit weiß ich nicht, ob das realisierbar ist.

    Grundsätzlich brauchst du nur ein Fenster, das unsichtbar im Hintergrund dümpelt und mit dem du von externen Programmen (AutoIt) Nachrichten empfängst. In SciTE gibt es, wie schon bereits angesprochen, das SciTE Director Interface dafür. Vielleicht kann der Autor von PSPad das ja noch implementieren. Ist kein großes Hexenwerk und m.M. nach ohne große Probleme integrierbar.

    Das Fenster für die Kommunikation könnte man mit jeder beliebigen Anwendung erstellen. Aber die Möglichkeit die Nachricht WM_COPYDATA auszuwerten, muss in PSPad implementiert werden.

  • Vielleicht kann der Autor von PSPad das ja noch implementieren. Ist kein großes Hexenwerk und m.M. nach ohne große Probleme integrierbar.

    Der Autor von PSPad hat schon viele, wirklich viele meiner Feature Requests umgesetzt. Aber bei 2 - 3 Anfragen trift man bei Jan Fiala auf schweres Terrain, z.B. bei "highlight all occurrences of selected Word" und beim Thema Kommunikation mit PSPad von außen. Für das "highlight occurrences" Problem habe ich fast 1 Jahr gekämpft, dann wurde diese Anfrage erfüllt. Für eine Kommunikationsmöglichkeit mit PSPad von außen kämpfe ich fast genauso lange, aber ich habe wenig Hoffnung, dass die Anfrage erfüllt wird.


    Jan Fiala hat scheinbar Bedenken, dass jemand damit PSPad außer Gefecht setzen könnte. Ich finde das unbegründet, weil PSPad auch anders leicht blockiert werden könnte. Aber das ändert nichts daran, dass er keine Kommunikation einbaut.


    Somit benötigst du ein eigenes Kommunikations-Interface in PSPad. ...

    Grundsätzlich brauchst du nur ein Fenster, das unsichtbar im Hintergrund dümpelt und mit dem du von externen Programmen (AutoIt) Nachrichten empfängst.

    Ich habe ihm vorgeschlagen, unsichtbare Memos zur Verfügung zu stellen, an die ein Au3 Script Nachrichten senden kann. Im OnChange-Event der Memos können diese Nachrichten ausgwertet und in VBScript-Befehle gewandelt werden. - Leider gefällt ihm das nicht. :)


    Wie dem auch sei, auch das VBScript von PSPad läuft im WSH und erzeugt COM Objekte. Wie gesagt, habe ich damit schon experimentiert und Teilerfolge gehabt. Ich konnte rudimentär auf eine Information des COM Objekts von PSPad zugreifen und sie anzeigen. Leider war das weder zu kontrollieren, noch war es zuverlässig (mal hat es funktioniert, dann 10x nicht). Ich habe einfach von COM Objekten zu wenig Ahnung, das war einfach ein Rumgestochere. :S

  • Genauer gesagt, sollen im laufenden PSPad verschiedene VBScript-Funktionen von außen per AutoIt aufgerufen werden können, die dann auf interne Informationen von PSPad zugreifen.

    Diese Kommunikationsrichtung ist tatsächlich unter den gegebenen Voraussetzungen wohl nicht realisierbar.

    Wenn PSPad auf externe Nachrichten reagieren soll, ist das ja nur möglich, wenn intern kontinuierlich irgendein HTTP-Port oder eine Umgebungsvariable oder Event etc. abgefragt wird. Da du sagst, dass das nicht gegeben ist, sehe ich jetzt keinen erfolgversprechenden Ansatzpunkt. Das ist so, als ob du in ein Haus gehen möchtest, aber niemand macht die Tür auf, weil man dein Klingeln nicht hört.


    Du kannst doch eigene VBScripte in PSPad ausführen? - Dann solltest du versuchen, ob ein eigener Loop und Event installierbar ist (vielleicht nach diesem Bsp.), wenn der Autor nicht mag.