[英]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.