lz的意思是java中响应atl控件的事件?

解决方案 »

  1.   

    Javascript自己直接调用对应的callback
      

  2.   

    控件调用JS的回调有两种方式,一种是连接点,一种是回调属性。连接点在JS中几乎等于无用,通常是通过回调属性来完成回调的。
    回调属性的大概原理是这样的,在控件接口中增加一个叫做something_occ的可读性属性,属性类型是IDispatch*,这样JS可以直接通过设置属性的方式设置好回调(注意JS中的函数全部都是IDispatch*),例如 xxx.something_occ = function() { },或者通过HTML中的<PARAM>标签来设置(不同的实现方式,但本质相同)。当控件需要触发某事件时,如果发现something_occ属性已经被设置了回调,则可以直接调用这个回调,调用过程也很简单,abc->Invoke(0, ...) 即可,注意DISPID的值是0,这就是在调用JS设置的回调函数。
      

  3.   


    响应事件 我已经实现了 ,响应事件(连接点)的代码如下:
    <object id="AtlCom" width="200" height="200"  classid="clsid:FE5EB769-009B-4718-A703-106DB3EA0EF4" >
    </object>
    <script language="JavaScript1.2" for="AtlCom" event="SomeEvent(strMsg)">
    alert(strMsg);
    </script> 由于前端的开发 用jquery比较多,动态创建 控件,所以 这种方式不好用,我采用回调方式实现了
      

  4.   


    我的意思是 怎么通过 atl 属性回调 js, 特殊需要:)
      

  5.   


    谢谢你,这种方式我已经实现了,和你说的一样。
    我通过 自己控件的 一个 attachEvent方法传入的回调函数,如下:
    calc.attachEvent("onMsg",function innerFun(result){OnMSG(result);});但是 在PARAM 标签下设置 不成功,不知道是什么原因,通过调试,我发现 <param>标签设置 long ,bstr 等类型的 属性都没问题,就是 设置 IDispatch*属性不行,不知道是什么原因 
      

  6.   

    attachEvent虽然也能达到跟属性相同的回调效果,但它毕竟是方法而不是属性,方法只能用在脚本代码里,不能用于HTML中,而HTML中的PARAM标签是通过IPersistPropertyBag 和IPropertyBag 组合给控件提供初始化属性的机会,方法是做不到的,所以这也是我建议用属性而不是方法的原因。
    另外,PARAM标签提供初始化的属性数据只能是数字或者是字符串(本质都是字符串),就像value="someEvent"一样,这里仅提供回调函数的名称字符串,怎么处理这个字符串,那是控件自己的事,如果控件希望这是一个回调函数,那么控件就应该根据名称向脚本引擎查询根命名空间下的全局函数,查到了就把它当做回调函数保留起来作为内部属性的值,这跟 xxx.callback = function(){} 是完全一致的效果。说得太多了,楼主再不给我培训费,我就闭嘴了
      

  7.   

    呵呵,谢谢 redui 哈 。要不转让些专家分给你。有点明白了 ,param 是用于持久化的 ,所以 给它一个 idispatch 指针他也持久化不了我想到一个办法 ,不知道行不行得通 ,还是通过 
    <PARAM NAME="something_occ" VALUE="SomeEvent"></PARAM> 传入 ,只不过我接收成为 字符串。然后 在组件中 通过 IOleClientSite  找到  IOleContainer 然后 。。 如果在 控件创建在IE 中 那么可以找到   IHTMLDocument2  ,然后就可以根据传入的字符串 GetIDsOfNames,然后就可以invoke 了 。不知道这样行不行。还有 如果这样实现了 ,那么如果这个控件 生存在 普通的exe 程序中 ,那么我的EXE程序需要怎么办呢