【问题标题】:How can I execute Javascript in my Delphi program without TWebBrowser?如何在没有 TWebBrowser 的情况下在我的 Delphi 程序中执行 Javascript?
【发布时间】:2010-12-12 21:23:43
【问题描述】:

我正在使用一个使用 Javascript 接口发出请求的 Web API,响应是通过回调 Javascript 函数进行的。有没有办法在不使用TWebBrowsercomponent 的情况下从 Delphi 调用 Javascript 代码?

【问题讨论】:

    标签: javascript delphi


    【解决方案1】:

    您始终可以在 Windows 机器上运行 cscript.exe。

    优点:

    1. 它适用于自 Windows 98 以来的所有默认 Windows 安装。
    2. 很简单。
    3. 无需第三方 Delphi 组件。
    4. 不需要 dll 的 + 包装器,因此部署很简单。

    缺点:

    1. 您将产生新的进程。在 Web 服务器上启动 cscript.exe 感觉不对。我不确定安全隐患是什么。
    2. 您无法直接访问脚本引擎的内部。

    示例程序(这只是一个概念验证.. 可能有更好的方法来做到这一点):

    program JsExample;    
    {$APPTYPE CONSOLE}
    
    uses Windows, IoUtils;
    
    // start a new process
    function RunProgram(const aProg, aParams: string; aHow2Show: Word; const aWaitTime: dword): boolean;
    var LProcInfo: TProcessInformation; LStartUpInfo: TStartupInfo;
    begin
      FillChar(LStartUpInfo, SizeOf(TStartupInfo), #0); FillChar(LProcInfo, SizeOf(TProcessInformation), #0);
      with LStartUpInfo do
      begin
        cb := SizeOf(LStartUpInfo);
        lpReserved := nil; lpDesktop := nil; lpTitle := nil; lpReserved2 := nil; cbReserved2 := 0;
        dwFlags := STARTF_USESHOWWINDOW;
        wShowWindow := aHow2Show;
      end;
      Result := CreateProcess(nil, PChar(aProg + ' ' + aParams), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, LStartUpInfo, LProcInfo);
      if Result then
        Result := WaitForSingleObject(LProcInfo.hProcess, aWaitTime) <> WAIT_FAILED;
    end;
    
    // run javascript code
    procedure RunJs(const aJavaScript: String);
    var LTmpFileName: String;
    begin
      LTmpFileName := TPath.ChangeExtension(TPath.GetTempFileName, '.js');
      try
        TFile.WriteAllText(LTmpFileName, aJavaScript);
        RunProgram('cscript', '/NOLOGO "' + LTmpFileName + '"', SW_SHOWNORMAL, INFINITE);
      finally
        TFile.Delete(LTmpFileName);
      end;
    end;
    
    
    
    // main
    begin
    
      // execute some stupid javascript sample code
      RunJs
      (
        'var Text="Hello from JavaScript!";' + // creating a js variable
        'for(var i=0;i<Text.length;i++)' +     // creating a js looop
        '  WScript.Echo(Text.charAt(i));'      // calling string.charAt() and print some stuff
      );
    
      ReadLn;    
    end.
    

    这个方法真的很简单.. 将 JavaScript 写入文件,然后以文件名作为参数调用 cscript.exe。

    【讨论】:

      【解决方案2】:

      SpiderMonkey

      V8

      不知道这是否真的(仍然)有效。

      【讨论】:

        【解决方案3】:

        您在寻找 JavaScript 引擎吗?市场上有一些,例如 FastScript,我还看到了一个用于 Windows Scripting Host 的 Delphi 包装器(它支持 JavaScript)。但请注意,如果您的脚本使用与 Web 和浏览器相关的类和函数,那么除了基于浏览器的引擎之外,没有其他引擎能够提供它们。

        【讨论】:

          【解决方案4】:

          有没有办法从 Delphi 调用 Javascript 代码而不使用 TWebBrowser 组件?

          是的,为 SpiderMonkey (FireFox) javascript 引擎使用 JavaScript 包装器的其他方式。

          http://code.google.com/p/delphi-javascript/

          只需要 1 个 DLL。与 XE2/XE4/XE5 兼容。为 x86 和 x64 系统做好准备。

          使用示例: Can I execute a Javascript function inside Spidermonkey and get the return value?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 1970-01-01
            • 1970-01-01
            • 2017-02-02
            • 1970-01-01
            • 2016-11-01
            • 1970-01-01
            相关资源
            最近更新 更多