【发布时间】:2010-12-12 21:23:43
【问题描述】:
我正在使用一个使用 Javascript 接口发出请求的 Web API,响应是通过回调 Javascript 函数进行的。有没有办法在不使用TWebBrowsercomponent 的情况下从 Delphi 调用 Javascript 代码?
【问题讨论】:
标签: javascript delphi
我正在使用一个使用 Javascript 接口发出请求的 Web API,响应是通过回调 Javascript 函数进行的。有没有办法在不使用TWebBrowsercomponent 的情况下从 Delphi 调用 Javascript 代码?
【问题讨论】:
标签: javascript delphi
您始终可以在 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。
【讨论】:
【讨论】:
您在寻找 JavaScript 引擎吗?市场上有一些,例如 FastScript,我还看到了一个用于 Windows Scripting Host 的 Delphi 包装器(它支持 JavaScript)。但请注意,如果您的脚本使用与 Web 和浏览器相关的类和函数,那么除了基于浏览器的引擎之外,没有其他引擎能够提供它们。
【讨论】:
有没有办法从 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?
【讨论】: