atl activex 中如何调用 javascript 提供的回调函数

hbs_biscuit 2014-05-03 11:50:19
最近在写一个控件, js 前端开发人员希望做如此的调用:


function SomeEvent()
{
alert("some event occ");
}
function OnMSG(result)
{
alert("some msg:"+result);
}
</script>
<OBJECT ID='TestAtl' CLASSID='CLSID:0A138433-7AAD-4005-86FE-5F857A861BFB' width='120' height='80'>
<PARAM NAME="Digits" VALUE="102"></PARAM>
<PARAM NAME="something_occ" VALUE="SomeEvent"></PARAM>
</OBJECT>


找了一些资料,在 atl 中 通过定义:

PROP_DATA_ENTRY("Digits",m_nDigits,VT_I4) 可以正确得到 Digits的数值

但是 一直找不到 调用 SomeEvent 的方法。

有个宏 PROP_ENTRY_INTERFACE_CALLBACK 不会用,也不知道 是不是这个用处

通过 PROP_DATA_ENTRY("something_occ",m_myDisp,VT_DISPATCH) 也得不到 js SomeEvent的指针。

大家帮忙看一下 ATL 中如何能实现。

...全文
279 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbs_biscuit 2014-05-05
  • 打赏
  • 举报
回复
呵呵,谢谢 redui 哈 。要不转让些专家分给你。 有点明白了 ,param 是用于持久化的 ,所以 给它一个 idispatch 指针他也持久化不了 我想到一个办法 ,不知道行不行得通 ,还是通过 <PARAM NAME="something_occ" VALUE="SomeEvent"></PARAM> 传入 ,只不过我接收成为 字符串。 然后 在组件中 通过 IOleClientSite 找到 IOleContainer 然后 。。。。。。。。 如果在 控件创建在IE 中 那么可以找到 IHTMLDocument2 ,然后就可以根据传入的字符串 GetIDsOfNames,然后就可以invoke 了 。 不知道这样行不行。 还有 如果这样实现了 ,那么如果这个控件 生存在 普通的exe 程序中 ,那么我的EXE程序需要怎么办呢
redui 2014-05-05
  • 打赏
  • 举报
回复
attachEvent虽然也能达到跟属性相同的回调效果,但它毕竟是方法而不是属性,方法只能用在脚本代码里,不能用于HTML中,而HTML中的PARAM标签是通过IPersistPropertyBag 和IPropertyBag 组合给控件提供初始化属性的机会,方法是做不到的,所以这也是我建议用属性而不是方法的原因。 另外,PARAM标签提供初始化的属性数据只能是数字或者是字符串(本质都是字符串),就像value="someEvent"一样,这里仅提供回调函数的名称字符串,怎么处理这个字符串,那是控件自己的事,如果控件希望这是一个回调函数,那么控件就应该根据名称向脚本引擎查询根命名空间下的全局函数,查到了就把它当做回调函数保留起来作为内部属性的值,这跟 xxx.callback = function(){} 是完全一致的效果。 说得太多了,楼主再不给我培训费,我就闭嘴了。。。
wyx100 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 redui 的回复:
控件调用JS的回调有两种方式,一种是连接点,一种是回调属性。连接点在JS中几乎等于无用,通常是通过回调属性来完成回调的。 回调属性的大概原理是这样的,在控件接口中增加一个叫做something_occ的可读性属性,属性类型是IDispatch*,这样JS可以直接通过设置属性的方式设置好回调(注意JS中的函数全部都是IDispatch*),例如 xxx.something_occ = function() { },或者通过HTML中的<PARAM>标签来设置(不同的实现方式,但本质相同)。当控件需要触发某事件时,如果发现something_occ属性已经被设置了回调,则可以直接调用这个回调,调用过程也很简单,abc->Invoke(0, ...) 即可,注意DISPID的值是0,这就是在调用JS设置的回调函数。
redui 2014-05-04
  • 打赏
  • 举报
回复
控件调用JS的回调有两种方式,一种是连接点,一种是回调属性。连接点在JS中几乎等于无用,通常是通过回调属性来完成回调的。 回调属性的大概原理是这样的,在控件接口中增加一个叫做something_occ的可读性属性,属性类型是IDispatch*,这样JS可以直接通过设置属性的方式设置好回调(注意JS中的函数全部都是IDispatch*),例如 xxx.something_occ = function() { },或者通过HTML中的<PARAM>标签来设置(不同的实现方式,但本质相同)。当控件需要触发某事件时,如果发现something_occ属性已经被设置了回调,则可以直接调用这个回调,调用过程也很简单,abc->Invoke(0, ...) 即可,注意DISPID的值是0,这就是在调用JS设置的回调函数。
oyljerry 2014-05-04
  • 打赏
  • 举报
回复
Javascript自己直接调用对应的callback
worldy 2014-05-04
  • 打赏
  • 举报
回复
lz的意思是java中响应atl控件的事件?
ouyh12345 2014-05-04
  • 打赏
  • 举报
回复
为什么要这样设计? 控件更多是为了解决脚本不容易实现或提高效率 脚本自己执行这个函数,然后把结果传给控件
hbs_biscuit 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 redui 的回复:
控件调用JS的回调有两种方式,一种是连接点,一种是回调属性。连接点在JS中几乎等于无用,通常是通过回调属性来完成回调的。 回调属性的大概原理是这样的,在控件接口中增加一个叫做something_occ的可读性属性,属性类型是IDispatch*,这样JS可以直接通过设置属性的方式设置好回调(注意JS中的函数全部都是IDispatch*),例如 xxx.something_occ = function() { },或者通过HTML中的<PARAM>标签来设置(不同的实现方式,但本质相同)。当控件需要触发某事件时,如果发现something_occ属性已经被设置了回调,则可以直接调用这个回调,调用过程也很简单,abc->Invoke(0, ...) 即可,注意DISPID的值是0,这就是在调用JS设置的回调函数。
谢谢你,这种方式我已经实现了,和你说的一样。 我通过 自己控件的 一个 attachEvent方法传入的回调函数,如下: calc.attachEvent("onMsg",function innerFun(result){OnMSG(result);}); 但是 在PARAM 标签下设置 不成功,不知道是什么原因,通过调试,我发现 <param>标签设置 long ,bstr 等类型的 属性都没问题,就是 设置 IDispatch*属性不行,不知道是什么原因
hbs_biscuit 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 ouyh12345 的回复:
为什么要这样设计? 控件更多是为了解决脚本不容易实现或提高效率 脚本自己执行这个函数,然后把结果传给控件
我的意思是 怎么通过 atl 属性回调 js, 特殊需要:)
hbs_biscuit 2014-05-04
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
lz的意思是java中响应atl控件的事件?
响应事件 我已经实现了 ,响应事件(连接点)的代码如下:
	<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比较多,动态创建 控件,所以 这种方式不好用,我采用回调方式实现了
lgstudyvc 2014-05-04
  • 打赏
  • 举报
回复
js提供回调,供vc调用?

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧