我正在使用一个使用Javascript接口发出请求的Web API,响应是通过回调Javascript函数。有没有办法从Delphi调用Javascript代码而不使用TWebBrowser
组件?
答案 0 :(得分:5)
您始终可以在Windows计算机上运行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。
答案 1 :(得分:4)
答案 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?