2012-03-14 16 views
5

मैं एक dwscriptdwscript का उपयोग कर 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 समारोह निष्पादित कर सकते हैं है मिल रहा है?

अद्यतन

मैं अंत में इस मुद्दे को हल कर सकता है 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

मैं अनुमान लगा रहा हूं, लेकिन यह आपके फ़ाइल में निर्देश का उपयोग करता है: 'विंडोज, क्लासेस, 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 समारोह सामने आ जाएगी।

इसके अलावा, आप अपने VOleVariantVariant के बजाय के रूप में घोषित करने और इसे ठीक से काम करने के लिए Result := VarToStr(V.GetFileVersion(FileName)); करने के लिए लाइन बदलना चाहिए।

+0

बहुत बहुत धन्यवाद ¡¡¡¡¡¡¡¡¡¡ – Salvador

संबंधित मुद्दे