如何在没有TWebBrowser的情况下在我的Delphi程序中执行Javascript?

时间:2010-12-12 21:23:43

标签: javascript delphi

我正在使用一个使用Javascript接口发出请求的Web API,响应是通过回调Javascript函数。有没有办法从Delphi调用Javascript代码而不使用TWebBrowser组件?

4 个答案:

答案 0 :(得分:5)

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

优点:

  1. 自Windows 98以来,它在所有默认的Windows安装中都可用。
  2. 这很容易。
  3. 不需要第三方Delphi组件。
  4. 不需要dll的+包装器,因此部署很简单。
  5. 缺点:

    1. 您将产生新的流程。在Web服务器上启动cscript.exe感觉不对。我不确定安全隐患是什么。
    2. 您无法直接访问脚本引擎的内部。
    3. 示例程序(它只是一个概念验证......可能有更好的方法来执行此操作):

      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。

答案 1 :(得分:4)

SpiderMonkey

V8

没有任何线索,如果这些实际上(仍然)有效。

答案 2 :(得分:2)

您在寻找JavaScript引擎吗?市场上有一些,比如FastScript,我也看到了一个用于Windows Scripting Host的Delphi包装器(它支持JavaScript)。但请注意,如果您的脚本使用与Web和浏览器相关的类和函数,则除了基于浏览器的引擎之外,任何引擎都无法提供它们。

答案 3 :(得分:0)

  

有没有办法从Delphi调用Javascript代码而不使用   TWebBrowsercomponent?

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

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

只需要1个DLL。与XE2 / XE4 / XE5兼容。适用于x86和x64系统。

Usame样本: Can I execute a Javascript function inside Spidermonkey and get the return value?