2012-03-14 52 views
5

我試圖從一個dwscript如何使用dwscript調用CreateOleObject函數?

function GetFileVersion(const FileName: string): string; 
var 
    V : OleVariant; 
begin 
    V := CreateOleObject('Scripting.FileSystemObject'); 
    Result := V.GetFileVersion(FileName); 
end; 

內執行該代碼(這是爲了使用CreateOleObject最小樣品)到目前爲止,我想這

{$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, 
    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. 
+0

使用dwsComConnector? – 2012-03-14 18:08:22

+0

我剛剛添加該單位,具有相同的結果:(。 – Salvador 2012-03-14 18:18:29

+0

我在這裏猜測,但把這個使用指令在你的文件中:'使用Windows,類,SysUtils,dwsComp,dwsCompiler,dwsExprs, dwsComConnector,Variants,ActiveX ,ComObj,dwsXPlatform,dwsUtils;' – 2012-03-14 18:25:09

回答

2

這可以通過兩種方式來完成。

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所以你可以使用它。

此外,您應該聲明您的VOleVariant而不是Variant並將該行更改爲Result := VarToStr(V.GetFileVersion(FileName));以使其正常工作。

+0

非常感謝 – Salvador 2012-03-21 03:00:10