从JScript代码调用VB编写的函数(经典ASP)

时间:2012-04-10 05:39:41

标签: asp-classic vbscript jscript

目前我必须处理用VB编写的遗留系统。我对VB和ASP不太满意,所以我决定用JScript编写这个系统的新代码。

但是,这两种语言之间的互操作性存在一些问题:即,当我尝试调用<script language="vbscript">标记中声明的某些函数时,它会失败并显示“预期的对象 “错误(如果页面语言是VBScript),反之亦然。

即,以下代码:

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>

因以下错误而失败:

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

(如果我对特定行发表评论,其他三个陈述将正常工作);将页面语言设置为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

(再次,如果我将注释掉特定的行,其他三个语句将正常工作)。

在同一个应用程序中混合使用VB和JS有一个MSDN article,但从文章中可以看出示例代码应该可以工作,因为TestFunction在另一个文件中声明并且是一个函数之后所有

是否有某种方法可以使所有这些工作正常工作,并从VB和JS代码中同时调用VBTestFunctionJSTestFunction?我想应该有一个,否则混合JS和VB就没有意义了。

3 个答案:

答案 0 :(得分:6)

我一直在监视这个问题,Salman几乎已经回答了这个问题,但有些事情可以澄清。首先,正在引用的文章存在关键问题。它说执行的顺序是: -

  

1.非默认语言中元素的脚本
  2.内联脚本
  3.使用默认语言

的元素中的脚本

它错了,或者至少它已经过时了(它确实参考了IIS4之后)。 “内联脚本”(即默认语言中的脚本)的处理方式与同一语言的脚本元素不同。

以下是如何推断正在发生的事情。

  • 在任何解析开始之前,所有包含点都会被解析,并被包含文件中的内容替换,以创建单个词汇“文件”。这是在进行任何解析之前创建的。

  • 从每个语言的“文件”中收集脚本代码。您可以想象在找到每个块时会追加多个文件(每种语言一个)。请注意,这就是默认语言的<% %><script runat="server"实际上是不可分割的原因。

  • 任何静态内容(即runat="server"脚本标记或<% %>之外的内容)都被视为默认语言代码的一部分。将创建静态内容字节逐字发送到响应的Response.Write特殊形式创建并附加到原始文件中找到的默认语言代码。

  • 现在我们有一个或多个脚本可供各自的脚本引擎处理。非默认语言脚本首先解析执行。创建的任何全局标识符,无论是函数还是变量,都会添加到脚本环境中。但是,由于此时尚未处理默认语言脚本,因此可以随后添加到全局脚本环境中。

  • 当解析并执行默认语言脚本时,之前语言脚本创建的所有全局标识符都将添加到脚本环境中,因此可以从内联代码中使用。

    < / LI>

调用非默认函数可以追溯到默认语言的内联执行。

例如,如果默认语言为JScript,则可以使用VBScript函数(fnA)调用JScript(fnB)中声明的函数,只要调用{{1} }}是 JScript 的内联执行的一部分。 IOW JScript可以调用VBScript,而VBScript又可以调用VBScript等,限制因素是此链中顶部必须是JScript的引擎。

在您的示例代码中,您的VBScript的全局(内联)级别的代码试图调用以默认JScript语言声明的函数。如果您按照上面的项目符号进行操作,您将看到在执行该项目时,所调用的函数不存在。

答案 1 :(得分:2)

我鼓励您不要混用脚本语言。在the article you mentioned中,有一个标题为&#34;服务器脚本执行顺序&#34;在哪里说:

  

......然而,你将受到执行顺序的摆布   IIS ASP处理器。例如,如果您创建服务器脚本并运行它   在IIS 4.0中,您将找到此执行顺序:

     
      
  1. &lt; SCRIPT&gt;中的脚本非默认语言中的元素
  2.   
  3. 内联脚本
  4.   
  5. &lt; SCRIPT&gt;中的脚本默认语言中的元素
  6.   

记住这一点,这里是你的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")
%>

答案 2 :(得分: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

注意:

  • 包含的vbs文件中没有<script>标记。
  • 顶部的<%@ language="..." %>标记应指明“主要”语言。然后,将解释使用辅助语言(在您的情况下为VBScript)的<script>块,并且可用于主要语言的任何代码。

也许相关:How can I use Javascript OO classes from VBScript, in an ASP-Classic or WSH environment?