PascalScript Eigene Klasse

Rund um die LCL und andere Komponenten

PascalScript Eigene Klasse

Beitragvon compmgmt » 23. Dez 2017, 16:07 PascalScript Eigene Klasse

Hallo,

ich erstelle gerade mit RemObjects PascalScript eine Addon-Schnittstelle, für eine Software von mir. Wichtig ist mir dabei eine Sicherstellung der Datensicherheit des Benutzers. Deswegen wird jeder Zugriff auf eine Datei abgefangen und der Benutzer muss es erst erlauben, wenn der Zugriff außerhalb eines bestimmten Verzeichnisses ist. Man soll natürlich auch Dinge wie TStringList benutzen können, jedoch kann ich nicht einfach die Komponente für den Import von sysutils und Classes benutzen, da dort ja auch Methoden wie "TStringList.SaveToFile();" existieren. Das würde natürlich ohne Abfrage einfach durchgehen. Deswegen stelle ich die Frage, wie man selbst geschriebene Klassen für das Skript registrieren kann. Ich hab nämlich bisher nicht wirklich was gefunden.

Passendes Beispiel dazu:
FPC-Code:
Code: Alles auswählen
type
  TMyClass = class
    private
      FSomething: Integer;
      procedure SetSomething(i: Integer);
    public
      property FSomething: Integer read FSomething write SetSomething;
end;

PascalScript-Code:
Code: Alles auswählen
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.Something := 5;
  MyClass.Free;
end;
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon compmgmt » 24. Dez 2017, 06:01 Re: PascalScript Eigene Klasse

Also ich habe jetzt mal in die uPSC_classes.pas geschaut, da hab ich zwar gefunden, wie man eine Klasse registriert und es auch mal gleich ausprobiert, aber beim Ausführen des Skriptes gibt es eine Access Violation.
FPC-Code:
Code: Alles auswählen
interface
 
type
  TTestClass = class // Klasse für das Skript
    private
      FTest: String;
      procedure SetTest(s: String);
    public
      constructor Create;
      destructor Destroy;
      property Test: String read FTest write SetTest;
  end;
 
  TAddonHost = class // NICHT für das Skript; Instanz "AddonHost" wird bei initialization erstellt und bei finalization dekonstruiert
    private
      FCurrentAddon: String;
    public
      procedure Event(Method: String; const Params: array of Variant);
      procedure CallAddon(Addon, Method: String; const Params: array of Variant); // Wird aufgerufen, wenn ich das Skript kompilieren und ausführen möchte
      procedure PSOnCompile(Sender: TPSScript);
      property CurrentAddon: String read FCurrentAddon;
  end;
 
...
implementation
...
 
procedure TAddonHost.PSOnCompile(Sender: TPSScript);
begin
  ...
  with Sender do begin
    with Comp.AddClassN(nil, 'TTestClass') do begin
      RegisterMethod('constructor Create;');
      RegisterMethod('destructor Destroy;');
      RegisterMethod('procedure SetTest(s: String);');
      RegisterProperty('Test', 'String', iptRW);
    end;
  end;
end;
 
procedure TAddonHost.CallAddon(Addon, Method: String; const Params: array of Variant); // Wird aufgerufen, wenn ich das Skript kompilieren und ausführen möchte
var
  AddonFile: String;
begin
  AddonFile := CfgPath + 'Addons' + PathDelim + Addon + PathDelim + 'main.pas'; // CfgPath ist in einer anderen Unit definiert.
  if FileExists(AddonFile) then begin
    FCurrentAddon := Addon;
    with TPSScript.Create(Wnd_LazPlan) do begin
      try
        CompilerOptions := [icAllowUnit];
        UsePreProcessor := true;
        OnCompile := @PSOnCompile;
        Script.LoadFromFile(AddonFile);
        if Compile then ExecuteFunction(Params, Method)
           else MessageDlg('LazPlan', 'Error while compiling Addon script file "' + AddonFile + '"' + LineEnding
             + CompilerErrorToStr(0), mtError, [mbOK], 0);
      finally
        Free;
      end;
    end;
  end
  else begin
    FCurrentAddon := '';
    ThrowError(E_FILE_NOT_EXISTS);
  end;
end;


Und dazu der passende PascalScript-Code:
Code: Alles auswählen
program TestAddon;
 
procedure OnTest;
var
  t: TTestClass;
begin
  t := TTestClass.Create;
  t.Test := 'hallo';
  //t.Destroy; // Wenn es nicht auskommentiert ist, kommt die Meldung "Methode DESTROY konnte nicht gefunden werden"
  t := nil;
end;
 
begin
end.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Soner » 24. Dez 2017, 14:08 Re: PascalScript Eigene Klasse

Gib basis Klasse an z.b.:
Code: Alles auswählen
 
TTestClass = class(TObject)
 //...
 


Beim Registrieren dasselbe:
Code: Alles auswählen
 
with Sender do begin
    with Comp.AddClassN(cl.FindClass('TObject'), 'TTestClass') do begin
 

Dann musst du auch nicht Destroy registirieren.

Es gibt im original Paket Klassenimporter das kannst du benutzen. In Bin-Ordner PSUnitImporter.exe heißt es.

Bei Lazarus-PascalScript kann TStringList.Create nicht verwendet werden, ich habe bei Lazarus-Bugreport ein Workaround dafür gemeldet, es wurde ignoriert. Wenn du TStringList.Create brauchst, dann schaue in Lazarus-Bugtracker.

Edit:
Ich würde in deiner Stelle für die Sicherheitseinstellungen direkt Pascalscript ändern, das ist dann weniger Arbeit. Ich mache das immer, LCL, FCL und vieles ändere ich und notiere für die zukunftige Lazarusversionen die Änderungen. Das ist viel einfacher als komplett neu schreiben.
Soner
 
Beiträge: 382
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon compmgmt » 24. Dez 2017, 14:48 Re: PascalScript Eigene Klasse

Soner hat geschrieben:Gib basis Klasse an z.b.:
Code: Alles auswählen
 
TTestClass = class(TObject)
 //...
 


Beim Registrieren dasselbe:
Code: Alles auswählen
 
with Sender do begin
    with Comp.AddClassN(cl.FindClass('TObject'), 'TTestClass') do begin
 

Dann musst du auch nicht Destroy registirieren.
Hab ich auch schon mit TObject als Vererber probiert, hat nicht geklappt.

Soner hat geschrieben:Es gibt im original Paket Klassenimporter das kannst du benutzen. In Bin-Ordner PSUnitImporter.exe heißt es.
Ah, ok. Vielen Dank.

Soner hat geschrieben:Bei Lazarus-PascalScript kann TStringList.Create nicht verwendet werden, ich habe bei Lazarus-Bugreport ein Workaround dafür gemeldet, es wurde ignoriert. Wenn du TStringList.Create brauchst, dann schaue in Lazarus-Bugtracker.

Edit:
Ich würde in deiner Stelle für die Sicherheitseinstellungen direkt Pascalscript ändern, das ist dann weniger Arbeit. Ich mache das immer, LCL, FCL und vieles ändere ich und notiere für die zukunftige Lazarusversionen die Änderungen. Das ist viel einfacher als komplett neu schreiben.
Ok, vielen Dank.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Soner » 24. Dez 2017, 15:00 Re: PascalScript Eigene Klasse

Hast du die Klasse auch bei TPSScript.OnExecute importiert?
Klassen und Funktionen müssen beim Kompilieren(OnCompile) und beim Ausführen(OnExecute) registiert werden.
Soner
 
Beiträge: 382
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon compmgmt » 24. Dez 2017, 16:23 Re: PascalScript Eigene Klasse

Soner hat geschrieben:Hast du die Klasse auch bei TPSScript.OnExecute importiert?
Klassen und Funktionen müssen beim Kompilieren(OnCompile) und beim Ausführen(OnExecute) registiert werden.
Nein, ich hab alles nur beim OnCompile registriert. Das könnte der Grund sein, weshalb es zu einer Zugriffsverletzung kommt.

Nochmal zum Import-Tool: Wo genau befindet sich das Tool? Ich hab unter https://github.com/remobjects/pascalscript zwar eine Icon-Datei mit dem Namen gefunden, aber keine fertige exe oder Projektdatei zum selbst kompilieren.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Soner » 25. Dez 2017, 16:46 Re: PascalScript Eigene Klasse

PSUnitImporter habe ich hier hochgeladen:
https://1drv.ms/u/s!AvJGv-C_3b-WgQtLL8I3ApBS6Qkl
Es ist compiliertes Programm, Quelltext lag nicht dabei.

Hier wird erklärt Klassen verwendet werden:
https://github.com/remobjects/pascalscript/wiki/Using-Classes-with-RemObjects-PascalScript
Soner
 
Beiträge: 382
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon Mathias » 25. Dez 2017, 16:49 Re: PascalScript Eigene Klasse

Ich habe dein ersten Post angeguckt.
Code: Alles auswählen
property FSomething:

Sollte dort nicht Something anstelle FSomething stehen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3377
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon compmgmt » 26. Dez 2017, 10:04 Re: PascalScript Eigene Klasse

Mathias hat geschrieben:Ich habe dein ersten Post angeguckt.
Code: Alles auswählen
property FSomething:

Sollte dort nicht Something anstelle FSomething stehen ?

Ja, sollte es. Aber das war nur ein Beispiel schnell so getippt. Das habe ich nie real verwendet. Nur die TTestClass ist per Copy&Paste tatsächlich aus meinem Programmcode.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon compmgmt » 26. Dez 2017, 10:06 Re: PascalScript Eigene Klasse

Soner hat geschrieben:PSUnitImporter habe ich hier hochgeladen:
https://1drv.ms/u/s!AvJGv-C_3b-WgQtLL8I3ApBS6Qkl
Es ist compiliertes Programm, Quelltext lag nicht dabei.
Vielen Dank für deine Bemühungen :D

Soner hat geschrieben:Hier wird erklärt Klassen verwendet werden:
https://github.com/remobjects/pascalscript/wiki/Using-Classes-with-RemObjects-PascalScript
Ja, die Seite hatte ich auch schon aufgerufen, aber da hab ich den Download nicht gefunden.
Der Prozesseinstiegspunkt "SignaturLaden" in Signatur.dll konnte nicht gefunden werden.
compmgmt
 
Beiträge: 304
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.0 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried