AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Skript-Engine integrieren

Ein Thema von I love Delphi · begonnen am 23. Aug 2010 · letzter Beitrag vom 24. Aug 2010
Antwort Antwort
Benutzerbild von Daniela.S
Daniela.S

Registriert seit: 1. Mär 2008
Ort: Niederösterreich
226 Beiträge
 
Delphi XE4 Enterprise
 
#1

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 19:01
Oder Pascal Script
  Mit Zitat antworten Zitat
I love Delphi

Registriert seit: 6. Nov 2007
68 Beiträge
 
#2

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 19:34
Hallo,
also erstmal vielen Dank für Eure Antworten. Also Sysygys ScriptEngine kenne ich bereits und Pascal-Script habe ich mir auch gerade mal angeguckt. Allerdings habe ich bei beiden keinerlei Hinweise darauf gefunden, dass sich die Möglichkeiten auch einbschränken lassen. Zwar könnte man einfach das jeweilige Skript nach "verbotenen" Befehlen besuchen, da es ja jedoch fast unendlich viele Möglichkeiten gibt, wäre dies recht unsinnig. Man könnte es jedoch per "Whitelist" machen, allerdings wäre auch das sehr kompliziert. Weiß jemand von Euch also noch etwas zum Thema Beschränkung der Möglichkeiten? Ich möchte wie gesagt zum Beispiel nur, dass alle Methoden und Attribute eines bestimmten Objekts verfügbar sind.

Vielen Dank!

Mit freundlichen Grüßen,
I love Delphi!
  Mit Zitat antworten Zitat
Florian Hämmerle
(Gast)

n/a Beiträge
 
#3

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 19:38
Mit der SE2 von littleDave hat man nur Zugriff auf die Sachen, die du der Scriptengine zur Verfügung stellst. zB kannst du einen Button verfügbar machen, das Edit links davon aber nicht. Von Anfang an hat die SE2 keinen Zugriff auf dein Programm, erst wenn du ihr Sachen freigibst, kann sie darauf zugreifen.

mfg Florian
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 19:40
Wie verstehst du das mit dem Beschränken der Möglichkeiten? Ich weiß zwar nicht genau, wie das bei diesen Skriptengines gelöst ist, jedoch bin ich mir ziemlich sicher, dass die aufrufbaren Funktionen/Objekte/Typen zuvor bei der Engine registriert werden müssen. Solange du nicht die mitgelieferten Standardbibliotheken lädst, kannst du somit ganz genau bestimmen was getan werden darf und was nicht.

Lediglich die Funktionalität mancher Skriptsprachen externe Bibliotheken (DLLs) zu laden musst du irgendwie unterbinden.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.645 Beiträge
 
#5

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 19:42
Was PascalScript angeht kannst du da mal im Supportforum bzw. den Support newsgroups von RemObjects Nachfragen. Die Jungs da kennen sich aus
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#6

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 20:12
In meiner SEII kann man nur auf Objekte, Eigenschaften und Methoden zugreifen, die man selbst auch der Script-Engine zur Verfügung stellt.

Falls du meine Script-Engine ausprobieren willst, würde ich dir das PDF-File, welches sich in meinem Download befindet, empfehlen. Ich denke, dass es eine schnelle Übersicht über SEII geben sollte.

Von deiner Anforderungsliste wird von meiner Script-Engine alles Unterstützt - und sogar noch einiges mehr
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
I love Delphi

Registriert seit: 6. Nov 2007
68 Beiträge
 
#7

AW: Skript-Engine integrieren

  Alt 23. Aug 2010, 20:33
Hallo nochmal,
nochmals vielen Dank! Ich werde mich jetzt mal an littleDaves SEII "dran machen". Mein Kompliment an Dich, dass du sowas entwickelt hast
Wenn ich es eingebaut habe melde ich mich mal bei dir

Vielen Dank an Euch, ist echt ne tolle Community hier!

Viele Grüße,
I love Delph!
  Mit Zitat antworten Zitat
I love Delphi

Registriert seit: 6. Nov 2007
68 Beiträge
 
#8

AW: Skript-Engine integrieren

  Alt 24. Aug 2010, 15:11
So,
habe mich jetzt in das PDF zu SE2 eingelesen, das "einbauen" ist mir allerdings nicht geglückt. Zwar bekomme ich keinerlei Fehlermeldungen, dafür aber auch nicht das was ich will. Wenn ich die Dokumentation richtig verstanden habe, brauche ich doch eine Unit die die Prozeduren registriert und den Quelltext der, welche die external-Aufrufe beinhaltet, in einer Konstanten enthält. Auf die sollte ich dann während der Ausführung zugreifen können, richtig?

Mein Code:
Delphi-Quellcode:
unit Skripting;

interface

uses AdSprites, Dialogs, murmel, SysUtils, uSE2Compiler, uSE2UnitCacheMngr, uSE2Errors, uSE2Reader, uSE2PEData, uSE2RunTime, uSE2RunAccess, uSE2UnitManager, uSE2Consts, Murmelspiel_Form1_CODE;

  procedure Prepare();
  procedure ParseSkript(ASkript: String; AMurmel: TMurmel);
  procedure ZeigeNachricht(ANachricht: String);
  procedure Murmel_SetXSpeed(AXSpeed: double; AMurmel: TMurmel);
  procedure Murmel_SetYSpeed(AYSpeed: double; AMurmel: TMurmel);

const
// diese Variable mit dem Namen der Unit füllen
C_UnitName = 'SkriptCommands';
// in diese Variable kommt der komplette Script-Quelltext
C_UnitSource =
  'unit SkriptCommands;'+#13#10+ #13#10+
  'interface'+#13#10+#13#10+
  'uses Murmel, Skripting;'+#13#10+#13#10+
  'procedure ZeigeNachricht(ANachricht: String); external;'+#13#10+
  'procedure Murmel_SetXSpeed(AXSpeed: double; AMurmel: TMurmel); external;'+#13#10+
  'procedure Murmel_SetYSpeed(AYSpeed: double; AMurmel: TMurmel); external;'+#13#10+#13#10+
  'implementation'+#13#10+#13#10+
  'end.';

var
  Compiler : TSE2Compiler;
  RunTime : TSE2RunTime;
  PEData : TSE2PE;

implementation

procedure Unit_GetSource(var Target: string);
begin
  Target := C_UnitSource;
end;

procedure Unit_RegisterMethods(const Target: TSE2RunAccess);
begin
  if Target.HasUnit(C_UnitName) then
  begin
    // hier die Funktions-Pointer setzen
    Target.Method['ZeigeNachricht[0]', C_UnitName] := @ZeigeNachricht;
  end;
end;

procedure RegisterUnit;
var p : TSE2MethodUnit;
begin
  p := TSE2MethodUnit.Create;
  p.DoRegisterMethods := Unit_RegisterMethods;
  p.DoGetUnitSource := Unit_GetSource;
  p.UnitName := C_UnitName;
  TSE2UnitManager.RegisterUnit(p);
end;

procedure ParseSkript(ASkript: String; AMurmel: TMurmel);
begin
  //ShowMessage('Hallo');
  //Das Parsen übernimmt nun die S(cript) E(ngine) 2 (http://www.delphipraxis.net/140590-scriptengine-ii-v-0-5-3-2-a-4.html)
  Compiler := TSE2Compiler.Create;
  try
    PEData := Compiler.Compile(ASkript);
    if PEData <> nil then
    begin
      RunTime := TSE2RunTime.Create;
      try
        RunTime.AppCode := PEData;
        RunTime.Initialize;
        Pause:=true; //Spiel während Skript-Ausführung anhalten
        RunTime.Run;
        Pause:=false;
        RunTime.Finalize;
        RunTime.AppCode := nil;
      finally
        RunTime.Free;
      end;
    end;
  except
    ShowMessage('Beim Ausführen des Skripts ist ein Fehler aufgetreten!');
  end;
  PEData.Free;
end;

procedure Murmel_SetXSpeed(AXSpeed: Double; AMurmel: TMurmel);
begin
  AMurmel.XSpeed := AXSpeed;
end;

procedure Murmel_SetYSpeed(AYSpeed: Double; AMurmel: TMurmel);
begin
  AMurmel.YSpeed := AYSpeed;
end;

procedure ZeigeNachricht(ANachricht: string);
begin
  ShowMessage(ANachricht);
end;

initialization
RegisterUnit;

end.
Das hier wäre der Aufruf, der funktioniert jedoch: Skripting.ParseSkript(Sprite.Skript, self); Vielleicht habe ich auch einfach das Konzept dahinter noch nicht ganz verstanden...


Ich hoffe, jemand versteht mich.

Vielen Dank!

Viele Grüße,
I love Delphi!

EDIT: Als Skript habe ich folgendes verwendet:
Delphi-Quellcode:
program MyScriptProject;
uses
SkriptCommands;
begin
ZeigeNachricht('Hallo');
end.

Geändert von I love Delphi (24. Aug 2010 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz