随笔 - 3  文章 - 4  trackbacks - 0
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

防止自己再不好好写,想到的先吧标题写上~~~
给自己一片悬崖,虽然我们都在前进,但只有没了退路的我们才会只想办法前进,而不是另寻出路~
相信自己,就没有什么做不到的~

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

其实做法很简单,就是ATL类中用一个 IDispatch* 来保存javascript函数,在调用时直接调用 IDispatch DSPID为0的method即可,简单的示例代码如下:
 1 STDMETHODIMP CCallBackScript::put_cbMethod(IDispatch* newVal)
 2 {
 3     IDispatch *tmp = NULL;
 4     if(m_callbackmethod)
 5     {
 6         IDispatch *tmp = m_callbackmethod;
 7         m_callbackmethod = NULL;
 8 
 9         tmp->Release();
10     }
11     
12     tmp = newVal;
13     tmp->AddRef();
14     m_callbackmethod = tmp;
15 
16     return S_OK;
17 }
18 

这样m_callbackmethod中就保存了对应的javascript方法对象。
调用方式如下:
 1 STDMETHODIMP CCallBackScript::Call(void)
 2 {
 3     if(m_callbackmethod)
 4     {
 5         return _com_dispatch_raw_method(m_callbackmethod,0,DISPATCH_METHOD,VT_EMPTY,NULL,
 6             L"\x0003\x0008",300,::SysAllocString(L"测试中文"));
 7     }
 8     //其他对应的处理
 9     return S_OK;
10 }
11 

这样就实现了回调函数,至于_com_dispatch_raw_method嘛可以看我的另一篇日志 IDispatch 接口方法的调用 !

使用代码如下:
 1 <html>
 2 <head>
 3 <title>测试</title>
 4 <script language=javascript>
 5 <!--
 6 function cbmthod(i,str) {
 7     alert("i\t= " +i+ "\nstr\t= " + str);
 8     //尚不清楚这里抛出异常该如何捕获
 9 }
10 
11 var scrcb ;
12 try{
13     scrcb = new ActiveXObject("TestScriptCallBack.CallBackScript");
14 }
15 catch(e){
16     alert(e.message);
17 }
18 
19 scrcb.cbMethod = cbmthod;
20 
21 function abc(){
22     try{
23         scrcb.Call();
24     }
25     catch(e){
26         alert(e.message);
27     }
28 }
29 
30 
31 //-->
32 </script>
33 </head>
34 <body>
35 <input type=button value=点击测试 onclick="abc()" />
36 </body>
37 </html>

当然在多线程中不这么方便,需要 CoMarshalInterface CoUnmarshalInterface 来协助完成!
 
这里写了一个 例子,可以看看 

别处摘抄:
说明
该技术仅适用于脚本。不适合于VB、C++客户。
该技术和连接点、事件无关。

posted on 2009-11-19 13:49 静静的想 阅读(2244) 评论(1)  编辑 收藏 引用 所属分类: Windows/COM开发

FeedBack:
# re: 从ATL中调用javascript函数 2010-11-10 16:06 大炮哥
这段没看明白!
#include "comdef.h"

STDMETHODIMP CCallBackScript::Call(void)
{
if(m_callbackmethod)
{
return _com_dispatch_raw_method(m_callbackmethod,0,DISPATCH_METHOD,VT_EMPTY,NULL, L"\x0003\x0008",300,::SysAllocString(L"测试中文"));
}
//其他对应的处理
return S_OK;
}

// _com_dispatch_raw_method(m_callJs,
12,//
DISPATCH_METHOD,
VT_EMPTY,
NULL,
L"\x0016",//此处怎么设置的?后面BSTR的字节数?
::SysAllocString(L"BBBDDDDD"));
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理