Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
Delphi 12 Athens
|
AW: Windows Scripting Host (WSH)
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
Geändert von himitsu ( 6. Nov 2023 um 21:09 Uhr)
|