加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

但我收到此错误消息

Syntax Error: Unknown name “CreateOleObject” [line: 5,column: 8]

问题是如何使用dwscript执行CreateOleObject功能?

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));使其正常工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读