2010-12-12 12 views
13

मैं अनुरोध करने के लिए एक जावास्क्रिप्ट इंटरफ़ेस का उपयोग करता है कि एक वेब एपीआई के साथ काम कर रहा हूँ, और प्रतिक्रिया एक कॉलबैक जावास्क्रिप्ट समारोह के माध्यम से है। TWebBrowser घटक का उपयोग किए बिना डेल्फी से जावास्क्रिप्ट कोड को कॉल करने का कोई तरीका है?मैं कैसे TWebBrowser बिना मेरे डेल्फी कार्यक्रम में जावास्क्रिप्ट निष्पादित कर सकते हैं?

उत्तर

5

तुम हमेशा खिड़कियां मशीनों पर cscript.exe चला सकते हैं।

लाभ:

  1. यह उपलब्ध है सभी डिफ़ॉल्ट खिड़कियों पर खिड़कियां 98.
  2. यह मृत आसान है के बाद से स्थापित करता है।
  3. कोई तृतीय-पक्ष डेल्फी घटकों की जरूरत है।
  4. कोई डीएलएल + रैपर की आवश्यकता नहीं है, इसलिए तैनाती सरल है।

नुकसान:

नई प्रक्रियाओं
  1. आप को उत्पन्न करने दिया जाएगा। वेब सर्वर पर 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. 

इस विधि बहुत आसान है .. एक फाइल करने के लिए JavaScript लिखते हैं, फिर फ़ाइल नाम के साथ पैरामीटर के रूप में cscript.exe को कॉल करें।

2

आप एक JavaScript इंजन के लिए देख रहे हैं? बाजार में कुछ हैं, जैसे कि फास्टस्क्रिप्ट, और मैंने विंडोज स्क्रिप्टिंग होस्ट (जिसमें जावास्क्रिप्ट समर्थन है) के लिए डेल्फी रैपर भी देखा। नोट, हालांकि, यदि आपकी स्क्रिप्ट वेब- और ब्राउज़र से संबंधित वर्गों और कार्यों का उपयोग करती हैं, तो ब्राउज़र-आधारित एक को छोड़कर कोई इंजन उन्हें पेश करने में सक्षम नहीं होगा।

4

SpiderMonkey

V8

कोई सुराग अगर यह वास्तव में (अब भी) के किसी भी हालांकि काम करता है।

0

TWebBrowsercomponent का उपयोग किए बिना डेल्फी से जावास्क्रिप्ट कोड को कॉल करने का कोई तरीका है?

हाँ, दूसरी तरह के Spidermonkey (फ़ायर्फ़ॉक्स) के लिए जावास्क्रिप्ट आवरण जावास्क्रिप्ट इंजन का उपयोग करने के लिए।

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?

संबंधित मुद्दे

 संबंधित मुद्दे