delphi – 如何使用dwscript调用CreateOleObject函数?
发布时间:2020-12-15 09:47:12 所属栏目:大数据 来源:网络整理
导读:我正在尝试从dwscript内部执行此代码(这是一个最小的样本,以便使用CreateOleObject) function GetFileVersion(const FileName: string): string;var V : OleVariant;begin V := CreateOleObject('Scripting.FileSystemObject'); Result := V.GetFileVersion(
我正在尝试从dwscript内部执行此代码(这是一个最小的样本,以便使用CreateOleObject)
function GetFileVersion(const FileName: string): string; var V : OleVariant; begin V := CreateOleObject('Scripting.FileSystemObject'); Result := V.GetFileVersion(FileName); end; 到目前为止我试过这个 {$APPTYPE CONSOLE} {$R *.res} uses SysUtils,ComObj,ActiveX,dwsComp,dwsCompiler,dwsExprs,dwsCoreExprs; procedure Execute; var LScript: TDelphiWebScript; LUnit: TdwsUnit; LProg: IdwsProgram; LExec: IdwsProgramExecution; begin LScript := TDelphiWebScript.Create(NIL); LUnit := TdwsUnit.Create(NIL); try LUnit.UnitName := 'Foo'; LUnit.Script := LScript; // compile a simple script LProg := LScript.Compile( 'function GetFileVersion(const FileName: string): string;'+sLineBreak+ 'var'+sLineBreak+ ' V : Variant;'+sLineBreak+ 'begin'+sLineBreak+ ' V := CreateOleObject(''Scripting.FileSystemObject'');'+sLineBreak+ ' Result := V.GetFileVersion(FileName);'+sLineBreak+ 'end;'+sLineBreak+ ''+sLineBreak+ 'PrintLn(GetFileVersion(''Foo''));'+sLineBreak+ '' ); if LProg.Msgs.HasErrors then begin Writeln(LProg.Msgs.AsInfo); Exit; end; try LExec := LProg.Execute; except on E: Exception do WriteLn(E.Message + sLineBreak + LExec.Msgs.AsInfo ); end; Writeln(LExec.Result.ToString); finally LScript.Free; end; end; begin try Execute; Readln; except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; end. 但我收到此错误消息
问题是如何使用dwscript执行 UPDATE 根据Linas的建议,我终于可以解决这个问题了. 这是一个示例工作应用程序 uses SysUtils,dwsComConnector,dwsCoreExprs; procedure Execute; var LScript: TDelphiWebScript; LUnit: TdwsUnit; LProg: IdwsProgram; LExec: IdwsProgramExecution; LdwsComConnector : TdwsComConnector; begin LScript := TDelphiWebScript.Create(NIL); LdwsComConnector:=TdwsComConnector.Create(nil); LdwsComConnector.Script:=LScript; LUnit := TdwsUnit.Create(NIL); try LUnit.UnitName := 'Foo'; LUnit.Script := LScript; // compile a simple script LProg := LScript.Compile( 'function GetFileVersion(const FileName: string): string;'+sLineBreak+ 'var'+sLineBreak+ ' V : OleVariant;'+sLineBreak+ 'begin'+sLineBreak+ ' V := CreateOleObject(''Scripting.FileSystemObject'');'+sLineBreak+ ' Result := VarToStr(V.GetFileVersion(FileName));'+sLineBreak+ 'end;'+sLineBreak+ ''+sLineBreak+ 'PrintLn(GetFileVersion(''C:BarFoo.exe''));'+sLineBreak+ '' ); if LProg.Msgs.HasErrors then begin Writeln(LProg.Msgs.AsInfo); Exit; end; try LExec := LProg.Execute; except on E: Exception do WriteLn(E.Message + sLineBreak + LExec.Msgs.AsInfo ); end; Writeln(LExec.Result.ToString); finally LScript.Free; LdwsComConnector.Free; end; end; begin try CoInitialize(nil); try Execute; Readln; finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname,':',E.Message); end; end. 解决方法
这可以通过两种方式实现.
1种方法:您必须将TdwsComConnector(从单元dwsComConnector)丢弃到您的数据模块或表单(或手动创建)并将脚本实例分配给它.例如.: dwsComConnector1.Script := LScript; 2种方法: interface uses dwsFunctions,dwsSymbols,dwsExprs; type TCreateOleObjectFunc = class(TInternalFunction) procedure Execute(info : TProgramInfo); override; end; implementation uses OleAuto; { TCreateOleObjectFunc } procedure TCreateOleObjectFunc.Execute(info : TProgramInfo); begin Info.ResultAsVariant := CreateOleObject(Info.ValueAsString['ClassName']); end; initialization RegisterInternalFunction(TCreateOleObjectFunc,'CreateOleObject',['ClassName',cString],cVariant,True); 这会将CreateOleObject函数暴露给DWScript,因此您可以使用它. 此外,您应该将V声明为OleVariant而不是Variant,并将该行更改为Result:= VarToStr(V.GetFileVersion(FileName));使其正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |