Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78676
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 161
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-04 17:48
文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: Windows平台

2015-01-23 02:18:25

1.在js中调用一个Com组件;
由于使用了ActiveXObject,因此只能在IE浏览器下使用;

点击(此处)折叠或打开

  1. <html>
  2. <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4.     <title>加法计算</title>
  5.     <script language="javascript" type="text/javascript">
  6.         // <![CDATA[

  7.         function add_onclick()
  8.        {
  9.          var atlCom=new ActiveXObject("FirstComB.MyMath.1");//创建com对象
  10.          var num1 =document.getElementById("Text1").value; // 获取第一个数
  11.          var num2 =document.getElementById("Text2").value; // 获取第二个数
  12.          var Result= 0;
  13.          Result = atlCom.Add(num1,num2);
  14.          alert(Result);
  15.         
  16.         }

  17.         // ]]>

  18.     </script>

  19. </head>
  20. <body >
  21.     <p> 输入数一:<input id="Text1" type="text" /></p>
  22.     <p> 输入数二:<input id="Text2" type="text" /></p>
  23.     <p> <input id="Button4" type="button" value="相加" onclick="return add_onclick()" /></p>
  24. </body>
  25. </html>
2.COM 调用JS的方法:
此方法参考网上的资料,实现com回调js中的函数
JS中代码:

点击(此处)折叠或打开

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type"    content="text/html;    charset=UTF-8" />
  4. <title>xxxx</title>
  5.   <script language="javascript"    type="text/javascript">
  6.         // <![CDATA[
  7.           //回调函数
  8.          function printMsg(msg1, msg2, msg3)
  9.          {    
  10.              alert(msg1);    
  11.              alert(msg2);
  12.              alert(msg3);

  13.          }    

  14.         function add_onclick()
  15.        {
  16.           var obj=new    ActiveXObject("TEST.MyTest.1");//创建com对象
  17.           //在Com中注册回掉函数
  18.           obj.SetJsCallbackFunc(printMsg);
  19.           //显示结果    
  20.           obj.Print();
  21.         }

  22.         // ]]>        

  23.     </script>
  24. </head>
  25. <body>
  26.     <p> <input id="Button4" type="button" value="相加" onclick="return add_onclick()" /></p>

  27. </body>
  28. </html>
COM中:
Com组件中定义函数接口,以便将JS中定义的函数作为参数传递给Com组件
 
头文件中定义IDispatch接口:
 
[cpp] 
static CComPtr m_spCallback;  
[cpp]  
STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback)  
{  
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  
  
    // TODO: 在此添加实现代码  
    if (scriptCallback.vt == VT_DISPATCH)  
    {  
        m_spCallback = scriptCallback.pdispVal;  
    }  
  
  
    return S_OK;  
}  
  
 
Com组件中调用JS函数:
[cpp]  
void CJSCallBack::CallJsFunction()  
{  
    CComVariant avarParams[5];  
  
    avarParams[0] = “AAA”; //指定回调函数的参数  
    avarParams[1] = "BBB";  
    avarParams[2] = "CCC";  
    avarParams[3] = "DDD";  
    avarParams[4] = "EEE";  
  
    DISPPARAMS params = { avarParams, NULL, 5, 0 };  
    if(m_spCallback)  
    {  
        HRESULT hr = m_spCallback->Invoke(0,   
            IID_NULL,   
            LOCALE_USER_DEFAULT,   
            DISPATCH_METHOD,   
            ¶ms, NULL, NULL, NULL);       
    }  
}  
几点注意的地方:
 
1,DISPPARAMS params = { avarParams, NULL, 5, 0 },中的第三个参数将决定要传递到JS函数中的参数的个数
 
2,在JS函数中参数的顺序与Com组件中赋值的顺序是反的,根据本例代码,参数数组中第一个是"AAA",最后一个是"EEE",但是实际在JS代码中,msg1的值是"EEE",msg5的值是"AAA"
 
调用过程:
 
[javascript]  
obj.Print("AAA",0);  
[cpp] view plaincopy
STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait)  
{  
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  
  
    CallJsFunction();         
  
    return S_OK;  
}  



阅读(964) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~