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

Sal*_*dor 13 javascript delphi

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

Wou*_*ick 5

您始终可以在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.
Run Code Online (Sandbox Code Playgroud)

这个方法非常简单..将JavaScript写入文件,然后使用文件名作为参数调用cscript.exe.