2012-03-14 3 views
5

나는 지금까지 내가이dwscript를 사용하여 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. 

는하지만 난 해요 시도한 dwscript

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

의 내부에서이 코드를 (이 된 CreateOle을 사용하기 위해 최소한의 샘플입니다)을 실행하기 위해 노력하고있어 이 오류 메시지

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를 사용 하시겠습니까? –

+0

방금 ​​장치를 추가했는데 같은 결과를 얻었습니다. (. – Salvador

+0

여기에 추측하고 있지만이 지시어를 파일에 사용합니다 :'Windows, 클래스, SysUtils, dwsComp, dwsCompiler, dwsExprs, dwsComConnector, Variants, ActiveX , ComObj, dwsXPlatform, dwsUtils; ' –

답변

2

입니다.

1 방법 : 당신은 TdwsComConnector (단위 dwsComConnector)에서 데이터 모듈이나 폼에 드롭 (또는 수동으로 생성)과에 스크립트 인스턴스를 할당해야합니다. 예컨대 :

dwsComConnector1.Script := LScript; 

2 방법 : 당신이 그것을 사용할 수 있도록이 DWScript로 된 CreateOle 기능을 노출합니다

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

.

또한 VVariant 대신 OleVariant으로 지정하고 올바르게 작동하게하려면이 라인을 Result := VarToStr(V.GetFileVersion(FileName));으로 변경해야합니다.

+0

대단히 고마워요. ¡ ¡ ¡ ¡ ¡ – Salvador

관련 문제