簡體   English   中英

使用IScriptControl創建JScript對象

[英]Creating JScript objects using IScriptControl

有沒有比這更好的方法來在IScriptControl中創建對象?

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;

在MSScriptControl的CodeObject屬性上查詢IDispachEx接口。 它是JScript全局狀態的指針,它包含添加到其中的所有對象。 然后在要創建的對象名稱上使用DISPATCH_CONSTRUCT參數執行InvokeEx。 這等同於稱為“新”。

這將創建正確類型的對象,而您不必將其轉換為javascript類型。 您還可以將本機對象傳遞給構造函數。

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

這可以在JScript和VBScript活動腳本宿主上運行,但是其他一些腳本宿主在CodeObject上不返回任何內容,因此它不是非常可移植的。

要調用子例程,您需要使用Run方法而不是Eval。 有關更多信息,請參閱此文檔

您說“構造函數是不同的方法”是正確的,但是在這種情況下,您實際上只是在返回新構造的值,不是嗎? 因此,我希望仍然能夠使用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顯示為“ Wed Sep 16 23:37:14 TC + 0200 2009”。

因此,要從構造函數返回值,實際上可以使用Eval()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM