AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Windows Scripting Host (WSH)

Windows Scripting Host (WSH)

Ein Thema von himitsu · begonnen am 5. Nov 2023 · letzter Beitrag vom 7. Nov 2023
 
Benutzerbild von himitsu
himitsu
Online

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

AW: Windows Scripting Host (WSH)

  Alt 6. Nov 2023, 20: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.
Ein Therapeut entspricht 1024 Gigapeut.

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

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:52 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