是否可以在Classic ASP中处理来自activeX对象的事件

时间:2012-06-22 16:28:27

标签: asp-classic jscript

从我最近发布的另一个问题来看,似乎Classic ASP可能无法处理activeX对象可能抛出的事件。

任何人都可以验证这个或它是否可以,我该怎么做?

2 个答案:

答案 0 :(得分:1)

你是正确的ASP无法处理事件。它没有将脚本函数连接到事件所需的CreateObject签名,也不支持您可能在客户端使用的<script FOR语法。

答案 1 :(得分:1)

  

是否可以在Classic ASP

中处理来自activeX对象的事件

不,如果你是在谈论COM事件 但是,根据您对“事件”一词的含义,答案是“可能”。

请参阅Create COM/ActiveXObject in C#, use from JScript, with simple event

可以创建COM类/ ActiveX事物,在JScript / Classic ASP中实例化它,并让COM类调用ASP页面中定义的回调。这不是通过COM事件完成的,但它可能满足您的要求。

ASP代码可能如下所示:

<script language="Javascript" runat="server">

var greet = Server.CreateObject("Ionic.Greet");

greet.onHello = function(arg, num) {
    Response.Write("onHello (ASP) invoked.<br/>\n");
    Response.Write("  num = " + num + "  stat=" + arg.status + "<br/>\n");
};

response = greet.Hello("ASP");
Response.Write("response: " + response + "<br/>\n");
Response.Write("status: " + greet.status + "<br/>\n");

</script>

仅当正在创建的COM类公开可以设置的属性,然后在该属性上调用“Default method”时,此方法才有效。像这样:

public partial class Greet : IGreet
{
    public Object onHello { get; set; }

    public String Hello(string name)
    {
        var r = FireEvent();
        return "Why, Hello, " + name + "!!!" + r;
    }
}

...... FireEvent就像这样:

private string FireEvent()
{
    if (onHello == null) return " (N/A)";
    onHello
        .GetType()
        .InvokeMember
        ("",
         BindingFlags.InvokeMethod,
         null,
         onHello,
         new object [] {});

    return "ok";
}

显然,如果你有一个无法更改的COM类,并且它使用COM事件,那么这种方法将不适用。