Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Windows Scripting Host (WSH)

  Alt 6. Nov 2023, 21:07
32 Bit knallt auch.

Hmmmm, CoInitialize ist da ... daran liegt es nicht. (macht die VCL ja von selbst)

hier nur nochmal eine erweiterte Fehlerbehandlung.
Delphi-Quellcode:
  HR := Parser.AddScriptlet(nil, PChar('a = 123'), nil, nil, nil, nil, 0, 0, SCRIPTTEXT_ISVISIBLE, Name, ErrInfo);
  if Failed(HR) then
    raise Exception.CreateFmt('Error $%x %s'#10'$%x: %s', [HR, SysErrorMessage(Cardinal(HR)), ErrInfo.scode, ErrInfo.bstrDescription]);
// Cardinal, weil sonst die Bereichsprüfung knallt Integer<>Cardinal
// und die umgekehrte Variante von HResultFromWin32 auf die Schnelle nicht gefunden
Was mir beim Schreiben grade auffiel, dass ich AddScriptlet garnicht einzeln geteste hatte. (ist dort auskommentiert)

Und was noch komisch ist, dass das erste WScript.Echo ohne Fehler durch läuft.
Das müsste knallen, da WScript hier unbekannt sein sollte. und außerdem macht das Echo nicht -> nichts wird ins Konsolenfenster geschrieben.

Ansonsten ist es quasi fast der selbe Code, wie ich ihn gestern getestet hatte.
Delphi-Quellcode:
procedure TScriptingTestForm.btNativeExecuteClick(Sender: TObject);
var
  ClassID: TGUID;
  Engine: IActiveScript;
  ASite: IActiveScriptSite;
  Parser: IActiveScriptParse;
  ErrInfo: EXCEPINFO;
  Flags: DWORD;
  OResult: OleVariant;
  //Name: WideString;
  //Disp: IDispatch;
begin
  if Trim(edScriptlet.Text) = 'then begin
    cbScriptingEngine.Text := 'VBScript';
    edScriptlet.Text := 'MsgBox "Hello World! The current time is " & Now';
  end;

  // https://stackoverflow.com/questions/7491868/how-to-load-call-a-vbscript-function-from-within-c

  OleCheck(CLSIDFromProgID(PChar(ActiveScripting.ScriptingEngine), ClassID)); // e.q. 'VBScript'
  Engine := CreateComObject(ClassID) as IActiveScript;

  if cbNativeInteractiv.Checked then
    ASite := TDummyActiveScriptSite.Create(Self.Handle)
  else
    ASite := TDummyNonInteractiveScriptSite.Create;
  OleCheck(Engine.SetScriptSite(ASite));
  OleCheck(Engine.QueryInterface(IActiveScriptParse, Parser));
  OleCheck(Parser.InitNew);

  //OleCheck(Parser.ParseScriptText(PChar('WScript.Echo "abc"'), nil, nil, nil, 0, 0, SCRIPTTEXT_ISVISIBLE, nil, ErrInfo));
  //
  //OleCheck(Parser.AddScriptlet(nil, PChar('a = 123'), nil, nil, nil, nil, 0, 0, SCRIPTTEXT_ISVISIBLE, Name, ErrInfo));
  //OleCheck(Parser.ParseScriptText(PChar('a * 2 + 3'), nil, nil, nil, 0, 0, SCRIPTTEXT_ISEXPRESSION, @OResult, ErrInfo));
  //ShowMessage(VarToStrDef(OResult, '(NULL)'));
  OleCheck(Parser.ParseScriptText(PChar(edScriptletInit.Text), nil, nil, nil, 0, 0, SCRIPTTEXT_ISVISIBLE, nil, ErrInfo));
  Flags := IfThen(Sender = btNativeExpression, SCRIPTTEXT_ISEXPRESSION, 0) or SCRIPTTEXT_ISVISIBLE;
  if Failed(Parser.ParseScriptText(PChar(edScriptlet.Text), nil, nil, nil, 0, 0, Flags, @OResult, ErrInfo)) then
    raise Exception.CreateFmt('Error $%x: %s', [ErrInfo.scode, ErrInfo.bstrDescription]);
  edResult.Text := VarToStrDef(OResult, '(NULL)');

  //Engine.GetScriptDispatch(nil, Disp);
end;
Komm grade aus der Sauna und entspanne mich erstmal (viele Grüße von der EKON) ... schau später, ob ich den Fehler finde.
$2B or not $2B

Geändert von himitsu ( 6. Nov 2023 um 21:09 Uhr)
  Mit Zitat antworten Zitat