Как я могу выполнить Javascript в моей программе Delphi без TWebBrowser?

Я работаю с веб-API, который использует интерфейс Javascript для запросов, а ответ - через функцию Javascript обратного вызова. Есть ли способ вызвать Javascript-код из Delphi без использования компонента TWebBrowser?

Ответы

Ответ 1

Вы всегда можете запустить cscript.exe на машинах Windows.

Преимущества:

  • Он доступен для всех окон по умолчанию, установленных после Windows 98.
  • Он мертв легко.
  • Не требуется сторонних компонентов Delphi.
  • Нет необходимости использовать dll + wrappers, поэтому развертывание прост.

Недостатки:

  • Появятся новые процессы. Запуск cscript.exe на веб-сервере кажется неправильным. Я не уверен, каковы последствия для безопасности.
  • У вас нет прямого доступа к внутренним компонентам механизма сценариев.

Пример программы (это просто доказательство концепции.. есть, вероятно, лучшие способы сделать это):

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, а также я видел оболочку Delphi для Windows Scripting Host (которая поддерживает JavaScript). Однако обратите внимание, что если ваши скрипты используют классы и функции, связанные с веб-браузером, ни один движок, кроме браузера, не сможет их предложить.

Ответ 4

Есть ли способ вызвать Javascript-код из Delphi без использования TWebBrowsercomponent?

Да, другой способ использования JavaScript-оболочки для javascript-механизма SpiderMonkey (FireFox).

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

Требуется только 1 DLL. Совместимость с XE2/XE4/XE5. Готов к системам x86 и x64.

Пример использования: Могу ли я выполнить функцию Javascript внутри Spidermonkey и получить возвращаемое значение?