Announcement

Collapse
No announcement yet.

Visual Basic Scripte

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Visual Basic Scripte

    Hallo,

    meine Aufgabe ist es, aus Delphi heraus ein VBS-Script mit Parametern aufzurufen, diese im Script nach dort
    definierten Regeln auszuwerten und einen entsprechenden Wert nach Delphi zurückzuliefern.

    Ist so was prinzipiell möglich?
    Wer hat in der Richtung schon etwas programmiert und könnte mir einen Übungsquellcode zur Verfügung stellen
    (am besten mit VBS, da ich da totaler Neuling bin)

    Vielen Dank

  • #2
    Hallo,

    unter welcher Windows-Version soll das laufen? Unter Windows 2000 kann eine VBScript-Datei (Sourcecode) als "COM-Objekt" im System registriert werden, wobei dann der Aufruf aus dem eigenen Programm analog zu den binären COM-Objekten erfolgt (Parameter übergeben, Rückgabewert direkt auslesen)

    Comment


    • #3
      Hallo Herr Kosch,

      da ich bei meiner Nachricht an Sie die Meldung 'no access' erhielt,
      bin ich mir nicht sicher, ob sie angekommen ist. Vorsichtshalber versuche
      ich es nochmal:

      vielen Dank für Ihren Beistand bei der Lösung dieser Aufgabe.
      Bitte haben Sie etwas Nachsicht mit mir als Anfänger.

      Folgender Teil des Programmes läuft schon:

      procedure TfrmOCX.Button1Click(Sender: TObject);
      var code: string;
      i: integer:
      begin
      code := '';
      Script.Clear;
      GetScriptControl;
      if FileExists('test.vbs') then begin //test.vbs: MsgBox"Hallo Welt"
      Script.LoadFromFile('test.vbs');
      end;
      screen.Cursor := crHourGlass;
      for i := 0 to Script.Count -1 do begin
      code := code + Script[i];
      end;
      if Script[0] = 'Sub Main()' then begin
      S.Reset;
      S.AddCode(code);
      S.ExecuteStatement(code);
      end else begin
      S.ExecuteStatement(code);
      end;
      screen.Cursor := crDefault;
      end;

      Wenn ich Sie nun richtig verstanden habe, erfolgt die Registrierung der VBScript-Datei
      nicht unter Delphi mit .tlb-Datei und _TLB.pas sowie CreateOleObject und ProgIDToClassID
      wie in Ihrem COM-Buch, sondern direkt im Betriebssystem auf Kommandozeilenebene?

      Vielen Dank für Ihre Hilf

      Comment


      • #4
        Hallo,

        die im Beispiel gezeigte Implementierung hat nichts mit der Umkapselung der VBScript-Datei als COM-Objekt zu tun. Es gibt 2 Alternativen:

        1. Das eigene Delphi-Programm greift über <b>IActiveScript</b> direkt auf die Scripting-Engine von Microsoft zu, um <b>beliebige</b> VBScript- bzw. JScript-Anweisungen auszuführen, wobei diese nicht unbedingt aus einer Datei stammen müssen. Die Übergabe von Parametern an das Script besteht dann wohl eher darin, dass das eigene Programm die Scriptzeilen inklusive der eingetragenen Werte selbst generiert. Wenn das eigene Programm ebenfalls eine Automation-Schnittstelle (COM-Objekt) zur Verfügung stellt, kann dieses Objekt direkt aus dem Script heraus aufgerufen werden. Man hat somit eine bidirektionale Verbindung zwischen Aufrufer und Script.

        2. Das eigene Delphi-Programm ruft ein COM-Objekt auf, wobei hier die interne Implementierung dieses COM-Objekts keine Rolle spielt. Dafür wird der Aufruf der Interface-Methoden, die Parameter-Übergabe sowie die Auswertung des Rückgabewertes bzw. der Output-Parameter vom COM-Standard geregelt.

        Es stellt sich somit die Frage, <b>was</b> überhaupt erreicht werden soll. Was soll das Script machen? Wenn es nur um eine Berechnung geht, ist es sinnvoller, dies gleich in ein mit Delphi entwickeltes COM-Objekt zu verpacken. Der Weg über die Scriptdatei macht nur dann sinn, wenn die interne Implementierung jederzeit über NotePad etc. geändert werden soll, ohne das Ganze neu compilieren zu müssen

        Comment


        • #5
          Hallo Herr Kosch,

          Im Grunde geht es darum, daß <b>automatisch</b>, z.B. von Fremdprogrammen, generierte Daten über Delphi in einer Datenbank gespeichert werden sollen.
          Hierbei fallen täglich Dateien verschiedener Herkunft an, die aufgrund ihrer automatischen Generierung Werte enthalten (können), die so nicht in der Datenbank gespeichert werden sollen.
          Um nun nicht die Regeln, was mit diesen (falschen) Werten geschehen soll, für jede Stelle in meinem Delphi-Programm festschreiben zu müssen, und um flexibel bei der Behandlung der Werte zu sein, möchte ich diese Werte vor der Speicherung als Parameter an ein VBScript weitergeben, in dem jede Stelle ihre (falschen) Werte in für sie gültige Werte nach selbst definierten Regeln ändern kann.
          Die nun gültigen Werte sollen zur Speicherung zurückgegeben werden.

          Es scheint, als wäre die Lösung über IActiveScript vorzuziehen!?
          Da ich kein Interface IActiveScript in Delphi gefunden habe, gehe ich davon aus, daß ich es in einer _TLB.pas selbst anlegen muß? Wenn ja, welches wären dann die nächsten Schritte?
          Gibt es hierzu vielleicht Literatur, die Sie mir zusätzlich zu Ihrem Buch COM/DCOM mit Delphi empfehlen können? Das Thema scheint doch weitaus komplexer zu sein, als angenommen.

          Vielen Dan

          Comment


          • #6
            Hallo,

            ich glaube nicht, dass der Umweg über VBScript an dieser Stelle sinnvoll ist. Es gibt 2 bessere Möglichkeiten:

            1. Das eigene Delphi-Programm stellt selbst eine Automation-Schnittstelle zur Verfügung, die von den Fremdprogrammen aufgerufen werden kann, um die einzufügenden Daten zu übergeben. Die Prüfung auf Plausibilität sowie die Anpassung nimmt dann das eigene Delphi-Programm vor.

            2. Das eigene Delphi-Programm ruft eigene mit Delphi geschriebene COM-Objekte auf, um fallbezogen die Plausiblitätsprüfungen bzw. Anpassungen abzuarbeiten. Anstelle diese Prüfung als VBScript in einer externen Daten zu implementieren, kann man diese Programmzeilen doch genauso gut in Delphi eintippen und compilieren lassen. Hinter VBScript verbirgt sich die Beschänkung auf <b>OleVariant</b>-Datentypen, bei einem eigenen COM-Objekt unterliegt man nicht diesen Zwängen (was die Sache zusätzlich erleichtert).

            Wenn die Microsoft Scripting Engine auf dem Rechner installiert ist (was bei Windows 2000 automatisch der Fall ist), kann man einen Interfacezeiger direkt über CreateComObject anfordern. Das von Microsoft vordefinierte Interface <b>IActiveScript</b> braucht man nur, wenn man eine Zeichenkette an die Microsoft Scripting Engine übergeben will, die dort als VBScript-/JScript-Makro ausgeführt wird. Man könnte zum Beispiel die folgende Zeichenkette als String ausführen lassen, nachdem das eigene Objekt <i>aObj</i> über AddNamedItem registriert wurde:
            <pre>
            Sub Main
            Dim aNumber
            aNumber = InputBox("Bitte tragen Sie den Ausgangswert ein.")
            aObj.Berechne aNumber
            End Sub
            </pre>
            Das VBScript fragt eine Benutzereingabe ab und übergibt diesen Wert als Parameter an ein zweites COM-Objekt. Allerdings macht dieser "Umweg" für Delphi überhaupt keinen Sinn, da das Objekt aObj direkt aufgerufen werden kann.

            In der Hilfedatei des <i>Microsoft Platform SDK</i> wird dieses Thema im Bereich <b>Microsoft® Windows® Script Interfaces</b> ausführlich dokumentiert. Noch umfangreicher sind die Infos in der <b>Microsoft MSDN Libary</b> (DVD oder 3 CDROMs).
            &#10

            Comment

            Working...
            X