2012-03-14 4 views
5

私はdwscriptどのように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. 

を試みたが、私は内側から(これはCreateOleObjectを使用するために、最小限のサンプルである)、このコードを実行しようとしていますこのエラーメッセージ

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

質問は、私が使用してdwscript CreateOleObject機能を実行することができる方法であるを取得?私は最終的に問題を解決することができLinasの提案に続き

UPDATE

これは、この2つの方法で達成することができるサンプル動作するアプリケーション

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を使用しますか? –

+0

私はちょうどそのユニットを追加しました:(。 – Salvador

+0

私はここに推測していますが、あなたのファイルに以下の指示を使用します: 'Windows、クラス、SysUtils、dwsComp、dwsCompiler、dwsExprs、 dwsComConnector、Variants、ActiveX 、ComObj、dwsXPlatform、dwsUtils; ' –

答えて

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); 

これはDWScriptにCreateOleObject機能を公開します。

また、VVariantの代わりにOleVariantと宣言して、正しく動作するように行をResult := VarToStr(V.GetFileVersion(FileName));に変更する必要があります。

+0

ありがとうございました¡¡¡¡¡¡¡ – Salvador

関連する問題