我为客户做了一个com控件有一些事件(如OnStateChange)发出,客户要求用htm调用。
一开始,一切正常htm中调用代码如下:<OBJECT ID="DvdPlayCtl" CLASSID="CLSID:EE9626A3-976C-470C-8282-07AB2FE2F85F"></OBJECT><SCRIPT language="JavaScript">DvdPlayCtl.attachEvent("OnStateChange", MyOnStateChange);function MyOnStateChange(state,info)
{
alert("state change to "+state+" ,"+info);
}
</script>
则一旦com的状态发生改变就发出OnStateChange事件,htm就可以正常接受并提示,但后来客户要求用
另一种方式声明com控件,代码如下:<SCRIPT language="JavaScript">
var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl");
</script>
即动态生成此com控件,则运行htm时以前的代码DvdPlayCtl.attachEvent部分出错:“对象不支持此操作”我有换了好几种方法,都不行,郁闷至今!
请大虾们指点!或者是com控件发出事件时有什么特别的要求还是脚本写的不对,本人com和htm都是菜鸟,还请不吝指教,哪怕有一点提示也好,先谢了!!!

解决方案 »

  1.   

    补充一下:我的com是用ATL向导做的full control的那种,事件也是用向导生成的
      

  2.   

    再补充一下:<SCRIPT LANGUAGE=javascript FOR="DvdPlayCtl " EVENT="MyOnStateChange(state,info)">
    MyOnStateChange(state,info);
    </script>
    这种方法也试过了,不行!郁闷中!!!
      

  3.   

    Write a OnStateChange property, which take an IDispatch parameter. You can then set this property to a event handler, such as a javascript function.
      

  4.   

    呵呵,大名鼎鼎的蒋晟先生给我回复,真是万分感谢。
    但我在com方面是个菜鸟,意思虽然懂了但怎么做还不太清楚,先生能否提供一点参考代码
    晚辈感激不尽,在线等待中......
      

  5.   

    Sorry, just made a mistake. The OnStateChange property should have a type of IDispatch, and take no parameter.
      

  6.   

    通过属性的方法将js function handler设置进去,高!
      

  7.   

    感谢大家的关注,尤其是蒋先生,这个问题按照蒋先生的提示已经圆满解决,现在我总结一下本贴。解决方法如下(以我的程序为例):1、在com中增加一个属性OnStateChange,其类型为IDispatch *并为其添加put方法。2、在put方法的实现中将传进的DISPATCH型指针赋给自己的成员变量IDispatch *m_pDispatch。STDMETHODIMP CDvdPlayCtl::put_OnStateChange(IDispatch *newVal)
    {
    // TODO: Add your implementation code here
    m_pDispatch = newVal;
    return S_OK;
    }3、定义成员函数void Send_Event(int state, TCHAR * info);在发送事件的函数中添加以下代码:
    if (m_pDispatch != NULL)
    {
    CComVariant* pvars = new CComVariant[2]; pvars[1] = state;//回调函数的第一个参数
    pvars[0] = info;//回调函数的第二个参数 DISPPARAMS disp = { pvars, NULL, 2, 0 };
    HRESULT hr = m_pDispatch->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
    delete[] pvars;
    }
        注意:
    1、 pvars的填充与函数参数顺序是相反的
    4、在htm中如下调用
    <script language="JavaScript"> var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl"); DvdPlayCtl.OnStateChange = OnStateChange;
    DvdPlayCtl.OnError = OnError; function OnStateChange(state,info)
    {
    alert("state change to "+state+" ,"+info);
    }
            </script>
    至此一切ok,希望此贴能给相同需求的朋友们一点帮助。再次感谢大家的关注。