Как вызвать функцию CreateOleObject с помощью dwscript?

Я пытаюсь выполнить этот код (это минимальный образец для использования CreateOleObject) изнутри dwscript

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.

Но я получаю это сообщение об ошибке

Синтаксическая ошибка: неизвестное имя «CreateOleObject» [строка: 5, столбец: 8]

вопрос в том, как я могу выполнить функцию CreateOleObject с помощью dwscript ?

ОБНОВИТЬ

Следуя предложениям Линаса, я наконец смог решить проблему.

Это пример рабочего приложения

uses
  SysUtils,
  ComObj,
  ActiveX,
  dwsComp,
  dwsCompiler,
  dwsExprs,
  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:\Bar\Foo.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.

person Salvador    schedule 14.03.2012    source источник
comment
Я только что добавил этот блок с теми же результатами :(.   -  person Salvador    schedule 14.03.2012
comment
Я предполагаю здесь, но поместите эту директиву использования в свой файл: uses Windows, Classes, SysUtils, dwsComp, dwsCompiler, dwsExprs, dwsComConnector, Variants, ActiveX, ComObj, dwsXPlatform, dwsUtils;   -  person LU RD    schedule 14.03.2012
comment
Посмотрите, как выполняется этот модульный тест для использования CreateOleObject : Тесты UCOMConnector.   -  person LU RD    schedule 14.03.2012
comment
@LURD, я не вижу, где CreateOleObject вызывается из каких-либо скриптов в этом тесте. В коде Delphi он вызывается для добавления элементов в базу данных.   -  person Rob Kennedy    schedule 14.03.2012
comment
@RobKennedy, я думаю, ты абсолютно прав.   -  person LU RD    schedule 14.03.2012
comment
Если вы не можете использовать CreateOleObject непосредственно из DWScript, вы можете создать свою собственную функцию-оболочку, чтобы вызывать ее и предоставлять эту функцию-оболочку для DWScript... Я думаю, что это довольно длинный путь, но должен ли он работать? (Отказ от ответственности: я только читал о DWScript).   -  person Marjan Venema    schedule 15.03.2012


Ответы (1)


Это может быть достигнуто двумя способами.

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));, чтобы она работала правильно.

person Linas    schedule 20.03.2012