2009-09-10 49 views
2

在IScriptControl中創建對象的方法比這更好嗎?使用IScriptControl創建JScript對象

Result := SC.Eval('new Date()'); 

我需要的是這樣的:

function CreateJSObject(JSClassName: string; Params: PDispParams): OleVariant; 

一個天真的實施將

var 
    S: string; 
begin 
    S := ''; 
    for I := P.cArgs - 1 downto 0 do 
    begin 
     if S <> '' then 
      S := S + ', '; 
     S := S + ConvertParamToJSSyntax(OleVariant(P.rgvarg[I])); 
    end; 
    Result := ScriptControl.Eval('new ' + JSClassName + '(' + S + ');'); 
end; 
+0

請詳細解釋。這是沒有意義的(至少對我來說)。 – roosteronacid 2009-09-10 13:35:25

+0

IScriptControl是來自Microsoft的Windows腳本宿主的接口。 IScriptControl中有方法用於運行JScr​​ipt方法,添加代碼或評估表達式(如上所述)。構造函數是不同的方法。我怎樣才能調用構造函數? – kaboom 2009-09-10 19:05:33

回答

1

查詢MSScriptControl的CodeObject屬性上的IDispachEx接口。它是JScript全局狀態的指針,它包含所有添加到它的對象。然後在要創建的對象名稱上使用帶有DISPATCH_CONSTRUCT參數的InvokeEx。這相當於稱爲「新」。

這將創建一個正確類型的對象,您不必將它們轉換爲JavaScript類型。您也可以將本地對象傳遞給構造函數。

我知道這適用於腳本中定義的構造函數。我不確定Date是一個本地屬性。

這適用於JScript和VBScript activescripting主機,但其他一些腳本宿主不會在CodeObject上返回任何內容,所以這不是很便攜。

0

要調用一個子程序,你需要使用Run方法,而不是評估和演示。有關更多信息,請參閱this doc

你說「構造函數是不同的方法」是正確的,但在這種情況下,你實際上只是返回新構造的值,不是嗎?所以我希望仍然能夠使用Eval()。

下面的代碼對我的作品:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ScriptControl: Variant; 
    Value: Variant; 
begin 
    ScriptControl := CreateOleObject('ScriptControl'); 
    ScriptControl.SitehWnd := Handle; 
    ScriptControl.Language := 'JScript'; 

    Value := ScriptControl.Eval('new Date();'); 
    ShowMessage(VarToStr(Value)); 
end; 

當我按一下按鈕,我ShowMessage顯示了 「週三09月16日23時37分14秒TC + 0200 2009」。

所以爲了從構造函數中返回值,實際上可以使用Eval()。

+0

謝謝你的回答,但我知道Run(見我以前的評論)和我瞭解Eval(見帖子)。我正在尋找一種更好的調用構造函數的方法:更快,而無需將參數轉換爲JavaScript語法。 – kaboom 2009-09-17 06:26:01

+0

現在完全混淆了,對不起。你是什​​麼意思「沒有將參數轉換成JavaScript語法?」在你回覆roosteronacid時,你問:「我怎樣才能調用構造函數?」但是現在你說你想在不使用JavaScript參數的情況下構造對象?如果你展示了你想要做的一些僞代碼,也許它會爲我清除一些東西。 – 2009-09-17 08:07:45

+0

我編輯了這個問題。我希望現在更清楚。 – kaboom 2009-09-17 10:50:28