pdScript with newLISP.dll

Started by HPW, August 08, 2011, 12:22:48 AM

Previous topic - Next topic

HPW

Hello,



I recently ran across pdScript which is a scripting interpreter build on top of remobjects pascalscript.

It allows to do GUI scripting under windows. Since it is light-weight itself, it fits good to newLISP.



I contacted the pdScript guys to ask them for some improvements for best newLISP intergration.

With the release of pdScript 1.5.5 the improvements are in place.

Thanks to the guys from precision who are open for user requests.



Interested may have a look at my sample posted here:



http://www.be-precision.com/forum/index.php?topic=162">http://www.be-precision.com/forum/index.php?topic=162



The sample shows how to call newLISP and how to support callbacks with up to 9 parameter.



The interpreter is free but the nice IDE will become shareware in the future.

The current IDE-beta is free.



Regards



Hans-Peter
Hans-Peter

HPW

#1
Hello,



I ported the newLISP turtle demo to the pdScript enviroment (to the latest developer snapshot) to show real graphics by callback-functions.



http://www.be-precision.com/forum/index.php?topic=181">http://www.be-precision.com/forum/index.php?topic=181



For an interpreter it still runs quite fast.



Regards



Hans-Peter
Hans-Peter

HPW

#2
Just released initial hpwPdScript 1.0 for neobook:



http://www.hpwsoft.de/anmeldung/html1/neobook/neobook25.html">http://www.hpwsoft.de/anmeldung/html1/n ... ook25.html">http://www.hpwsoft.de/anmeldung/html1/neobook/neobook25.html



http://www.neosoftware.com/forum/viewtopic.php?t=18808%3Cbr">http://www.neosoftware.com/forum/viewto ... t=18808<br">http://www.neosoftware.com/forum/viewtopic.php?t=18808<br



I build a neobook wrapper plugin around pdScript's new DLL version



Initial Release 1.0



Actionlist:



hpwPdScriptLoadDLL=Load the pdScript DLL from either a given path or a system path.



hpwPdScriptCall=Call the function pdScript from the DLL.



hpwPdScriptExCall=Call the function pdScriptEx from the DLL.



hpwPdScriptExLibCall=Call the function pdScriptExLib from the DLL.



hpwPdScriptInlineCall=Call the function pdScriptInline from the DLL.



hpwPdScriptInlineExCall=Call the function pdScriptInlineEx from the DLL.



hpwPdScriptInlineExLibCall=Call the function pdScriptInlineExLib from the DLL.



hpwPdScriptFreeDLL=Free pdScript DLL from memory.



hpwPdScriptGetFileInfo=Get the fileinfo (name+version) from a file!





A code-sample as inline-code for newLISP intergration in pdScript is also provided.

(A installed newLISP-package is needed)



Another code-sample as inline-code shows the callback from pdScript into neobook via script commands:



pdhpwPlayAction= Access to neobook's own scripting language

pdhpwGetVar= Get the value of a neobook variable

pdhpwSetVar= Set the value of a neobook variable
Hans-Peter

HPW

#3
Hello,



I ported the newLISP 'tower of hanoi' demo to the pdScript enviroment (to the latest developer snapshot) to show real graphics by callback-functions.



http://www.be-precision.com/forum/index.php?topic=191">http://www.be-precision.com/forum/index.php?topic=191



Regards



Hans-Peter
Hans-Peter

HPW

#4
I made another test with newlisp.exe calling a pdScript dialog.



file newLispExeForm.bat

(You should set the path to your own pathes)

"C:Programmenewlispnewlisp.exe" "C:Dokumente und EinstellungenwickhEigene DateienPascal scriptsnewLispExeForm.lsp"


newLispExeForm.lsp

;Test-Lsp for calling a pdScript-Dialog from newlisp.EXE
;written by Hans-Peter Wickern 04.09.2011

(import "user32.dll" "MessageBoxA")
(import "newlisp.dll" "newlispEvalStr")
(import "pdScriptE.dll" "pdScriptInlineExLibA")
;passing some testvalues to a newlisp-dll instance working as shared memory to pdScript-Dialog
(newlispEvalStr "(setq DllTest1 10 DllTest2 20 DllTest3 30)")
;Set up a pdScript dialog source DFM
(setq DfmText [text]
object PSForm: TPSForm
  Left = 279
  Top = 90
  BorderIcons = [biSystemMenu]
  BorderStyle = bsSingle
  Caption = 'newLispExeForm'
  ClientHeight = 114
  ClientWidth = 264
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesigned
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 188
    Top = 88
    Width = 73
    Height = 21
    Caption = 'OK'
    TabOrder = 0
  end
  object Edit1: TEdit
    Left = 4
    Top = 4
    Width = 257
    Height = 21
    TabOrder = 1
    Text = 'Edit1'
  end
  object Edit2: TEdit
    Left = 4
    Top = 32
    Width = 257
    Height = 21
    TabOrder = 2
    Text = 'Edit2'
  end
  object Edit3: TEdit
    Left = 4
    Top = 60
    Width = 257
    Height = 21
    TabOrder = 3
    Text = 'Edit3'
  end
  object Button2: TButton
    Left = 4
    Top = 88
    Width = 73
    Height = 21
    Caption = 'call DLL'
    TabOrder = 4
  end
end
[/text]
)
;Set up a pdScript pascal source
(setq DpasText [text]
program Script1;

function newLispEvalStr(paramstr: PChar): PChar; external 'newlispEvalStr@newlisp.dll stdcall';

procedure Button1_OnClick(Sender: TObject);
var  nlstr :string;
begin
 writeln('Dialog Result: '+Edit1.Text+' '+Edit2.Text+' '+Edit3.Text);
 nlstr := '(setq Edit1 "'+Edit1.Text+'" Edit2 "'+Edit2.Text+'" Edit3 "'+Edit3.Text+'")';
 showmessage (nlstr);
 newLispEvalStr(nlstr);
 Self.close;
end;

procedure Button2_OnClick(Sender: TObject);
var  r :string;
begin
 r  :=  newLispEvalStr('DllTest1');
 r := Copy(r,1,length(r)-1);
 Edit1.Text :=  r;
 r  :=  newLispEvalStr('DllTest2');
 r := Copy(r,1,length(r)-1);
 Edit2.Text :=  r;
 r  :=  newLispEvalStr('DllTest3');
 r := Copy(r,1,length(r)-1);
 Edit3.Text :=  r;
end;

procedure AssignEvents;
begin
  Button1.OnClick := @Button1_OnClick;
  Button2.OnClick := @Button2_OnClick;
end;

begin
  AssignEvents;
end.
[/text]
)
;Setup other pdScript params
(setq DpasParam "")
(setq DpasOutPutBuffer (dup "." 2000)) ;allocating buffer
(setq DpasLibPath "")
;call pdScript Inline
(setq scriptresult(pdScriptInlineExLibA DpasText DfmText DpasParam 0 DpasOutPutBuffer DpasLibPath))
(setq OutPutBuffer (get-string DpasOutPutBuffer))
;scriptresult is set to 0 when successfull
(MessageBoxA 0 (string "This is pdScript return-value: " scriptresult) "pdScript Test" 0)
;OutPutBuffer shows a few crypted nonsens chars instead of writeln-text from dialog, not sure why this happens
(MessageBoxA 0 (string "This is pdScript output buffer: " OutPutBuffer) "pdScript Test" 0)
;Getting back values from the newlisp DLL instance setted in dialog exit
(setq edit1 (replace "n"(get-string(newlispEvalStr "Edit1"))""))
(setq edit2 (replace "n"(get-string(newlispEvalStr "Edit2"))""))
(setq edit3 (replace "n"(get-string(newlispEvalStr "Edit3"))""))

(MessageBoxA 0 (string "This is back from DLL: " edit1 " " edit2 " " edit3) "pdScript Test" 0)

;(MessageBoxA 0 (string "pdScript test end") "pdScript Test" 0)
(exit)


A problem exist because OutPutBuffer does not show the content of the writeln.

Not sure if it is on the pdScript or newLISP side.

The DpasOutPutBuffer variable is defined as a PAnsiChar in the DLL.

When I test the same source from my neobook plugin it works as expected.

The writeln-output buffer is returned in the passed variable.



Hans-Peter
Hans-Peter

HPW

#5
Maybe the problem is in the function-declaration with keyword 'out' before pStdOut: PAnsiChar

TYPE
    TpdScriptInlineExLibFuncA = function(ScriptCode:PAnsiChar; ScriptDFM: PAnsiChar; Params:PAnsiChar; SyntaxCheckOnly:Bool; out pStdOut: PAnsiChar; LibraryPath:PAnsiChar): Integer; stdcall;
Hans-Peter

HPW

#6
Hello,



Just tested the new newlispCallback in the pdScript demo with embedded newlisp:



pdScript function import:

function newlispCallback(callbackname: PChar; callbackaddress: Integer; calltype: PChar): PChar; external 'newlispCallback@newlisp.dll stdcall';


pdScript call:

 newlispCallback('foo1',GetPDScriptCallbackAddrAsInt(1),'');
Hans-Peter

HPW

#7
Precision has released the pdScript-IDE 1.0 now as shareware:



http://www.be-precision.com/products/pdscript/">http://www.be-precision.com/products/pdscript/



The distribution contains several samples:



EmbeddedNewLISP  -           Sample for embedding newlisp.dll

EmbeddedNewLISPHanoi  -  The newlisp hanoi demo ported to pdScript

EmbeddedNewLISPTurtle  -  The newlisp turtle demo ported to pdScript

NewLISPExeForm  -             Using newlisp.exe with pdScript



PS: newlisp turtle needs a small fix to set the locale. Will be added to the distribution as soon as possible.
Hans-Peter

HPW

#8
Just released a new hpwPdScript 1.01:



http://www.hpwsoft.de/anmeldung/html1/neobook/neobook25.html">http://www.hpwsoft.de/anmeldung/html1/n ... ook25.html">http://www.hpwsoft.de/anmeldung/html1/neobook/neobook25.html



Contains latest version of much improved pdScriptE.dll 1.7.5.1



New actions:



hpwPdsGetScriptForm=Returns a main form handle (if exists) of previously executed script instance.

hpwPdsGetScriptResult=Returns current result of previously executed script instance.

hpwPdsGetScriptResultEx=Returns current result and output buffer of previously executed script instance.

hpwPdsExecuteFunction=Executes a function or procedure that is declared inside the script code.

hpwPdsExecuteFunctionEx=More complex variant of pdsExecuteFunction, that returns also FncResult string as a function result.

hpwPdsFreeScript=Releases prev.executed script instance (created with "keep-alive=true" option).



Precision has work hard on pdScript and has added some great additions to the language.

Now non-modal dialogs are possible. See sample page 2.

You can even script plugins with pdscript which can be added to neobooks rectangle like native plugins. See sample-page 3.

Other great improvments come also with pdScript. See pdScript doc.



From newLISP pdScript is usable either from the newLISP.exe and also from newLISP.dll.

Demos for both flavours are included in the distribution samples.



Hans-Peter
Hans-Peter

HPW

#9
Hello,



A new release of pdSript is available:



http://www.be-precision.com/products/pdscript/changelog.php">http://www.be-precision.com/products/pd ... ngelog.php">http://www.be-precision.com/products/pdscript/changelog.php



The new option to build standalone Exe might be interesting to combine with newlisp.dll



Regards
Hans-Peter