2012-04-10 28 views
6

से वीबी पर लिखे गए फ़ंक्शन को कॉल करें वर्तमान में मुझे वीबी में लिखे गए विरासत प्रणाली से निपटना होगा। मैं वीबी और एएसपी के साथ अच्छा नहीं हूं, इसलिए मैंने फैसला किया कि इस प्रणाली के लिए नया कोड जेस्क्रिप्ट में लिखा जाएगा। "उम्मीद वस्तु" अर्थात्, जब मैं कुछ समारोह <script language="vbscript"> टैग में घोषित कॉल करने के लिए कोशिश कर रहा हूँ, यह एक के साथ विफल त्रुटि (अगर पृष्ठ भाषा है:एक जेस्क्रिप्ट कोड (क्लासिक एएसपी)

हालांकि, वहाँ दो भाषाओं के बीच अंतर के साथ कुछ समस्या है वीबीस्क्रिप्ट), और इसके विपरीत।

अर्थात्, निम्नलिखित कोड:

VBTestFunction: from vbscript 
Microsoft VBScript runtime error '800a000d' 
Type mismatch: 'JSTestFunction' 
/test.asp, line 9 
:

inc.asp

<script language="vbscript" runat="server"> 
Sub VBTestFunction(Message) 
    Response.Write "VBTestFunction: " & Message 
End Sub 
</script> 
<script language="javascript" runat="server"> 
function JSTestFunction(Message) { 
    Response.Write("JSTestFunction: " + Message); 
} 
</script> 

testjs.asp

<%@ Language="JavaScript" %> 
<!-- #include file="inc.asp"--> 
<script language="javascript" runat="server"> 
    VBTestFunction("from javascript"); 
    JSTestFunction("from javascript"); 
</script> 
<script language="vbscript" runat="server"> 
    Call VBTestFunction("from vbscript") 
    Call JSTestFunction("from vbscript") 
</script> 

निम्नलिखित त्रुटि के साथ विफल

(यदि मैं विशिष्ट रेखा पर टिप्पणी करूंगा, तो अन्य तीन कथन ठीक काम करेंगे); VBScript

<%@ Language="VBScript" %> 
<!-- #include file="inc.asp"--> 
<script language="javascript" runat="server"> 
    VBTestFunction("from javascript"); 
    JSTestFunction("from javascript"); 
</script> 
<script language="vbscript" runat="server"> 
    Call VBTestFunction("from vbscript") 
    Call JSTestFunction("from vbscript") 
</script> 

करने के लिए पृष्ठ भाषा सेट निम्नलिखित त्रुटि के साथ विफल:

Microsoft JScript runtime error '800a138f' 
Object expected 
/test.asp, line 4 

(फिर से, अगर मैं विशिष्ट लाइन बाहर टिप्पणी करेंगे, अन्य तीन बयानों से कार्य करेंगे)।

एक ही अनुप्रयोग में वीबी और जेएस मिश्रण पर MSDN article है, लेकिन लेख से ऐसा लगता है कि उदाहरण कोड को काम करना चाहिए, क्योंकि TestFunction किसी अन्य फ़ाइल में घोषित किया गया है और यह सब कुछ है।

क्या यह सब कुछ काम करने के लिए कुछ तरीका है, और वीबी और जेएस कोड दोनों से VBTestFunction और JSTestFunction दोनों को कॉल करने के लिए? मुझे लगता है कि एक होना चाहिए, अन्यथा जेएस और वीबी मिश्रण करने में कोई बात नहीं होगी।

+2

आपके द्वारा उल्लिखित आलेख पर बारीकी से देखो, विशेष रूप से वह हिस्सा जहां "सर्वर स्क्रिप्ट ऑर्डर ऑफ एक्जिक्यूशन" कहता है। आपकी समस्या वहां है। –

+1

आलेख विशेष रूप से मुख्य कोड प्रवाह ("इनलाइन सर्वर स्क्रिप्ट") और सबराउटिन घोषणा के बीच की रेखा खींचता है। लेख से ऐसा लगता है कि किसी भी भाषा में एक सबराउटिन घोषित किया जा सकता है और मैं इसे किसी भी भाषा से कॉल करने में सक्षम हूं। – penartur

उत्तर

6

मैं थोड़ी देर के लिए इस प्रश्न की निगरानी कर रहा हूं और सलमान ने काफी जवाब दिया है लेकिन कुछ चीजें हैं जिन्हें स्पष्ट किया जा सकता है। सबसे पहले लेख के संदर्भ में महत्वपूर्ण समस्या है। इसमें कहा गया है निष्पादन के आदेश यह है कि: -

1.Script in elements in nondefault languages
2.Inline script
3.Script in elements in the default language

इसका गलत है, या कम से कम अपनी पुरानी हो गई (यह सब संदर्भ IIS4 के बाद करता है)। "इनलाइन स्क्रिप्ट" (जो कि डिफ़ॉल्ट भाषा में स्क्रिप्ट है) किसी भी भाषा के स्क्रिप्ट तत्वों से अलग नहीं है।

यहां क्या हो रहा है इसके माध्यम से तर्क देना है।

  • कोई भी पार्सिंग से पहले शुरू होता है सभी शामिल अंक का समाधान और एक भी शाब्दिक "फाइल" बनाने के लिए शामिल फ़ाइलों से सामग्री द्वारा प्रतिस्थापित कर रहे हैं। यह किसी भी पार्सिंग होने से पहले बनाया गया है।

  • प्रत्येक भाषा के लिए इस "फ़ाइल" से स्क्रिप्ट कोड एकत्र किया जाता है। आप कल्पना कर सकते हैं कि प्रत्येक फाइल के रूप में कई फाइलें (एक प्रति भाषा) संलग्न की जा रही हैं। ध्यान दें कि यही कारण है कि <% %> और <script runat="server" डिफ़ॉल्ट भाषा के लिए व्यावहारिक रूप से अविभाज्य है।

  • कोई भी स्थिर सामग्री (जो runat="server" स्क्रिप्ट टैग या <% %> के बाहर सामग्री है) को डिफ़ॉल्ट भाषा के लिए कोड का हिस्सा माना जाता है। Response.Write का एक विशेष रूप जो प्रतिक्रिया के लिए स्थैतिक सामग्री बाइट्स verbatim भेजता है मूल फ़ाइल में पाया गया बिंदु पर डिफ़ॉल्ट भाषा कोड में बनाया और जोड़ दिया गया है।

  • अब हमारे पास एक या अधिक स्क्रिप्ट हैं जो उनके संबंधित स्क्रिप्ट इंजन द्वारा संसाधित होने के लिए तैयार हैं। गैर-डिफ़ॉल्ट भाषा स्क्रिप्ट पार्स किए गए और पहले निष्पादित किए गए हैं। कोई वैश्विक पहचानकर्ता बनाया गया है, चाहे वह फ़ंक्शन या चर के लिए हो, स्क्रिप्ट वातावरण में जोड़ा गया हो। हालांकि, इस बिंदु पर डिफ़ॉल्ट भाषा स्क्रिप्ट को संसाधित नहीं किया गया है, इसके बाद भी यह वैश्विक स्क्रिप्ट पर्यावरण में शामिल हो सकता है।

  • जब तक डिफ़ॉल्ट भाषा स्क्रिप्ट को पारदर्शी और निष्पादित किया जाता है, तो पिछली भाषा स्क्रिप्ट द्वारा बनाए गए सभी वैश्विक पहचानकर्ता स्क्रिप्ट वातावरण में जोड़े गए होंगे और इसलिए इनलाइन कोड से उपयोग के लिए उपलब्ध हैं।

आप टिप्पणी ध्यान से है कि एक डिफ़ॉल्ट भाषा के समारोह शर्त यह है कि गैर डिफ़ॉल्ट समारोह में फोन पर गैर-डिफ़ॉल्ट भाषा में एक समारोह में कोड से कहा जा सकता है पता लगाया जा सकता चाहिए डिफ़ॉल्ट भाषा के इनलाइन निष्पादन के लिए।

उदाहरण डिफ़ॉल्ट भाषा है अगर के लिए JScript आप एक VBScript समारोह (FNA) एक समारोह JScript (एफएनबी) में घोषित फोन जब तक fnA करने के लिए कॉल की इनलाइन निष्पादन JScript के हिस्से के रूप किया जाता है हो सकता है। आईओएस जेस्क्रिप्ट वीबीस्क्रिप्ट में कॉल कर सकता है जो बदले में वीबीस्क्रिप्ट में कॉल कर सकता है और इसी तरह, सीमित कारक इंजन है कि इस श्रृंखला में शीर्ष इस परिदृश्य में जेस्क्रिप्ट होना चाहिए।

आपके उदाहरण कोड में आपके पास आपके वीबीस्क्रिप्ट के वैश्विक (इनलाइन) स्तर पर कोड था जो डिफ़ॉल्ट जेस्क्रिप्ट भाषा में घोषित फ़ंक्शन को कॉल करने का प्रयास कर रहा था। यदि आप उपर्युक्त गोलियों का पालन करते हैं तो आप देखेंगे कि बिंदु पर इसे निष्पादित किया गया कार्य मौजूद नहीं है।

+0

क्षमा करें, लेकिन लेख में उल्लिखित निष्पादन आदेश अभी भी मान्य है। IIS7 पर [इस स्क्रिप्ट] को चलाएं (http://snipt.org/uhEf7), [यह] (http://snipt.org/uhEe0), और [यह] (http://snipt.org/uhEd7) निष्पादन आदेश को नोट करें - यह वही रहता है, जैसा लेख में वर्णित है। आपके उत्तर में कुछ दावे गलत हैं, खासकर वे निष्पादन आदेश से संबंधित हैं। –

+0

आपके नोट के लिए: क्या आपका मतलब है कि वैश्विक नाम रिज़ॉल्यूशन रनटाइम पर होता है, इसलिए, मूल रूप से, सभी फ़ंक्शन कॉल इनलाइन होती हैं और फिर परिणामस्वरूप कोड को नियम के तहत निष्पादित किया जाता है "कोड को गैर-डिफ़ॉल्ट भाषा में पहले निष्पादित किया जाता है, डिफ़ॉल्ट भाषा में कोड अंतिम रूप से निष्पादित किया जाता है "? – penartur

0

मैं सभी नियमों का पता नहीं है, लेकिन यह मेरे लिए काम करता है:

Test.asp:

<%@ language="JavaScript" %> 

<script language="VBScript" runat="server" src="mix2.vbs"></script> 

<script language="JavaScript" runat="server"> 
    TestFunction("from javascript"); 
</script> 

mix2.vbs:

Sub TestFunction (message) 
    Response.Write message 
End Sub 

नोटिस:

  • वीबीएस फ़ाइल में कोई <script> टैग नहीं है जो कि uded।
  • शीर्ष पर <%@ language="..." %> टैग, "प्राथमिक" भाषा इंगित करना चाहिए। <script> द्वितीयक भाषा (आपके मामले में, वीबीस्क्रिप्ट) का उपयोग करने वाले ब्लॉक को प्राथमिक भाषा में किसी भी कोड के लिए व्याख्या और उपलब्ध कराया जाएगा।

हो सकता है कि संबंधित: How can I use Javascript OO classes from VBScript, in an ASP-Classic or WSH environment?

+0

मैंने अपना जवाब संशोधित किया। आप सुझाव विशिष्ट मूल समस्या को हल करता है, लेकिन वीबी कोड से जेएस कार्यों को कॉल करने की क्षमता को तोड़ देता है। – penartur

+0

यह वास्तव में नहीं है। आपको भाषा घोषणा को फिर से जिगर करने की जरूरत है। – Cheeso

2

मैं तुम्हें पटकथा भाषाओं नहीं मिश्रण करने के लिए प्रोत्साहित। the article you mentioned में, वहाँ एक शीर्षक "निष्पादन के सर्वर स्क्रिप्ट आदेश" शीर्षक से जहां लिखा है:

:

... However, you are then at the mercy of the order of execution of the IIS ASP processor. For example, if you create server script and run it in IIS 4.0, you'll find this execution order:

  1. Script in <SCRIPT> elements in nondefault languages
  2. Inline script
  3. Script in <SCRIPT> elements in the default language

रखते हुए मन में, यहाँ है कि कैसे अपने testjs.asp स्क्रिप्ट के निष्पादित होने, टिप्पणियाँ निष्पादन आदेश से संकेत मिलता है

<%@ Language="JavaScript" %> 
<script language="vbscript" runat="server"> 
    '' #1 
    Sub VBTestFunction(Message) 
     Response.Write "VBTestFunction: " & Message 
    End Sub 
</script> 
<script language="javascript" runat="server"> 
    // #3 
    function JSTestFunction(Message) { 
     Response.Write("JSTestFunction: " + Message); 
    } 
</script> 
<script language="javascript" runat="server"> 
    // #4 
    VBTestFunction("from javascript"); 
    JSTestFunction("from javascript"); 
</script> 
<script language="vbscript" runat="server"> 
    '' #2 
    Call VBTestFunction("from vbscript") 
    Call JSTestFunction("from vbscript") 
</script> 

सूचना लाइन है कि कारण बनता है त्रुटि:

Call JSTestFunction("from vbscript") 

इसका निष्पादन आदेश # 2 है, इस बिंदु पर फ़ंक्शन JSTestFunction परिभाषित नहीं किया गया है (इसे बाद में निष्पादन आदेश में परिभाषित किया गया है)।

अब

testvbs.asp फ़ाइल के लिए:

<%@ Language="VBScript" %> 
<script language="vbscript" runat="server"> 
    '' 3 
    Sub VBTestFunction(Message) 
     Response.Write "VBTestFunction: " & Message 
    End Sub 
</script> 
<script language="javascript" runat="server"> 
    // 1 
    function JSTestFunction(Message) { 
     Response.Write("JSTestFunction: " + Message); 
    } 
</script> 
<script language="javascript" runat="server"> 
    // 2 
    VBTestFunction("from javascript"); 
    JSTestFunction("from javascript"); 
</script> 
<script language="vbscript" runat="server"> 
    '' 4 
    Call VBTestFunction("from vbscript") 
    Call JSTestFunction("from vbscript") 
</script> 

लाइन है कि कारण बनता है त्रुटि:

VBTestFunction("from javascript"); 

फिर, VBTestFunction पहले यह परिभाषित किया गया है कहा जाता है। समाधान स्क्रिप्टिंग भाषाओं को मिश्रण न करने का प्रयास करना है। यदि यह बिल्कुल जरूरी है, तो अपनी स्क्रिप्ट के क्रम को संशोधित करें।

संपादित करें - उदाहरण

आप @ Language="JavaScript" निर्धारित किया है तो इस कोड अपेक्षित ढंग से काम करना चाहिए:

:

<!-- inc.asp--> 
<script language="vbscript" runat="server"> 
    Sub VBTestFunction(Message) 
     Response.Write "VBTestFunction: " & Message 
    End Sub 
</script> 
<% 
    function JSTestFunction(Message) { 
     Response.Write("JSTestFunction: " + Message); 
    } 
%> 

<!-- testjs.asp --> 
<%@ Language="JavaScript" %> 
<!-- #include file="inc.asp"--> 
<% 
    // at this point, both functions are available 
    VBTestFunction("from inline JavaScript"); 
    JSTestFunction("from inline JavaScript"); 
%> 

आप सभी कोड फिर से व्यवस्थित करने के लिए है आप तो @ Language="VBScript" उपयोग करना चाहते हैं

<!-- inc.asp--> 
<script language="javascript" runat="server"> 
    function JSTestFunction(Message) { 
     Response.Write("JSTestFunction: " + Message); 
    } 
</script> 
<% 
    Sub VBTestFunction(Message) 
     Response.Write "VBTestFunction: " & Message 
    End Sub 
%> 

<!-- testvbs.asp --> 
<%@ Language="VBScript" %> 
<!-- #include file="inc.asp"--> 
<% 
    ' at this point, both functions are available 
    VBTestFunction("from inline VBScript") 
    JSTestFunction("from inline VBScript") 
%> 
+0

मैंने जो आलेख उल्लेख किया है, विशेष रूप से बताता है कि यह केवल कोड के लिए महत्वपूर्ण है जो प्रक्रियाओं की घोषणाओं के लिए कुछ नहीं करता है। क्या आप यह कहने की कोशिश कर रहे हैं कि गैर-प्राथमिक भाषा में लिखे गए किसी भी कोड से प्राथमिक भाषा में लिखे गए फ़ंक्शन को कॉल करना असंभव है? – penartur

+0

आपके द्वारा उल्लिखित आलेख आपको कुछ सुझाव (और गॉथैस) देता है कि कैसे स्क्रिप्टिंग भाषाओं जैसे _... या तो