我正在使用一個使用Javascript接口發出請求的Web API,而響應是通過一個回調Javascript函數。有沒有一種方法可以在不使用TWebBrowser
組件的情況下調用Delphi的Javascript代碼?如何在沒有TWebBrowser的情況下在我的Delphi程序中執行Javascript?
13
A
回答
5
您可以隨時在Windows機器上運行cscript.exe。
優點:
- 它是適用於所有默認的Windows自Windows 98
- 它的死很容易安裝。
- 沒有第三方的Delphi組件需要。
- 沒有DLL的包裝需要,所以部署很簡單。
缺點:
- 你會產生新的進程。在Web服務器上啓動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
你正在尋找一個JavaScript引擎?市場上有一些例如FastScript,我還看到了Windows腳本宿主的Delphi包裝器(它支持JavaScript)。但是,請注意,如果您的腳本使用與網絡和瀏覽器相關的類和函數,則除基於瀏覽器的引擎之外,任何引擎都不能提供它們。
4
0
有沒有辦法從Delphi調用Javascript代碼而不使用 TWebBrowsercomponent?
是的,其他方式使用SpiderMonkey(FireFox)JavaScript引擎的JavaScript包裝。
http://code.google.com/p/delphi-javascript/
只需要1 DLL。與XE2/XE4/XE5兼容。適用於x86和x64系統。
Usame sample: Can I execute a Javascript function inside Spidermonkey and get the return value?
相關問題
- 1. 在沒有Application.ProcessMessages的情況下,TWebBrowser可以在Delphi的線程中使用嗎?
- 2. 如何在沒有shell的情況下執行.py程序?
- 3. 如何在沒有櫃檯的情況下執行此程序?
- 4. 如何在沒有JIT的情況下運行程序?
- 5. 如何在沒有提升的情況下執行應用程序?
- 6. 在沒有在Android中打開應用程序的情況下執行操作
- 7. 如何在沒有密碼提示的情況下執行mysqldump?
- 8. 如何在沒有隨機化的情況下執行uvm_do_on?
- 9. GDB如何在沒有斷點的情況下停止執行?
- 10. 如何在沒有構建文件的情況下執行Ant
- 11. 如何在沒有eval的情況下執行此操作()
- 12. 如何在沒有事務的情況下執行sproc?
- 13. 如何在沒有kexec的情況下執行linux內核?
- 14. 如何在沒有引導的情況下執行Angular代碼?
- 15. 如何在沒有WIN32 API的情況下執行此操作?
- 16. 如何在沒有QTCreator的情況下運行我的應用程序?
- 17. 如何在沒有Eclipse的情況下運行我的java程序?
- 18. 我的GAE應用程序如何在沒有app.yaml的情況下運行?
- 19. 在沒有線程的情況下同時執行python腳本
- 20. 在沒有擴展的情況下創建線程並執行
- 21. 在沒有線程的情況下限制Java執行時間
- 22. C#:如何在不停止程序執行的情況下執行線程
- 23. 如何在沒有文件名的情況下運行javascript
- 24. 在沒有Ajax的情況下執行asp.net postback後執行javascript函數
- 25. 如何在沒有輸入「python」的情況下在shell中運行python程序
- 26. 開關的情況下沒有在JavaScript
- 27. 在沒有拆分的情況下在JavaScript中進行交換
- 28. AirPrint如何在沒有驅動程序的情況下工作?
- 29. 如何在沒有System.Threading.Thread.Sleep的情況下停止程序。 C#?
- 30. 如何在沒有System.Web dll的情況下進行UrlDecode編程#