当前位置:首页 > 编程教程 > javascript技术文章 > COM组件中调用JavaScript函数详解及实例

COM组件中调用JavaScript函数的实例讲解

  • 发布时间:
  • 作者:码农之家
  • 点击:122

这篇文章主要知识点是关于COM组件、JavaScript函数、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

JavaScript编程全解
  • 类型:js编程大小:6.67 MB格式:PDF作者:井上诚一郎,土江拓郎,滨边将太,陈筱烟&
立即下载

COM组件中调用JavaScript函数详解及实例

COM组件中调用JavaScript函数详解及实例

要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:

1 、组件方(C++)

组件A 的方法在IDL中定义:

[id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback); 

组件A的方法实现:

// 假设回调原型为:  
// scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName); 
// 此方法由JS脚本来实现 
STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback) 
{ 
  CComPtr<IDispatch> spCallback; 
  if (scriptCallback.vt == VT_DISPATCH) 
     spCallback = scriptCallback.pdispVal; 
   
 
  // 参数准备 
  CComVariant varResult; 
  CComVariant avarParams[3]; 
  avarParams[0] = “开始计算股票”;    // bstrProgressName 
  avarParams[0].vt = VT_BSTR; 
  avarParams[1] = 100;               // nTotalProgress 
  avarParams[1].vt = VT_I4; 
  avarParams[2] = 0;                 // nCurrentProgress 
  avarParams[2].vt = VT_I4; 
  DISPPARAMS params = { avarParams, NULL, 3, 0 }; 
 
 
  if(spCallback) 
     spCallback->Invoke(0,  
        IID_NULL,  
        LOCALE_USER_DEFAULT,  
        DISPATCH_METHOD,  
        ¶ms, &varResult, NULL, NULL); 
 
  BOOL bFinished = false; 
   
 
  while(!bFinished) 
  { 
     // 计算工作… 
     Sleep(1000); 
     v1 = v1+v2; 
  
    // 回调客户 
    if(spCallback) 
    { 
      avarParams[0] = “正在计算股票…”; 
      avarParams[2] = 0; 
      spCallback->Invoke(0,  
             IID_NULL,  
             LOCALE_USER_DEFAULT,  
             DISPATCH_METHOD,  
             ¶ms, &varResult, NULL, NULL); 
     } 
 
     if(…) 
         bFinished = TRUE; 
   } // while OK! 
 
   return S_OK; 
} 

2、 客户方(JS)

<script language="javascript"> 
<!-- 
   // 符合回调原型:scriptCallbackFunc 
   function scfDisplayProgress(nCurrentProgress, nTotalProgress, bstrProgressName) 
   { 
       window.status = bstrProgressName + “:”+(nCurrentProgress *100/TotalProgress); 
   } 
  
   // 创建组件并执行longCalc 
   var objA = new ActiveXObject(“MyCom.A”); 
 
    // 使用回调: 执行时在IE状态栏显示进度 
    objA. longCalc (100, 200, scfDisplayProgress);  
 
    // 不使用回调 
    objA. longCalc (100, 200);  
//--> 
</script> 

3 说明

  • 该技术仅适用于脚本。不适合于VB、C++客户。
  • 该技术和连接点、事件无关。
  • 微软的XML DOM对象广泛使用这个方法。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • 关于Vue Component组件注册
  • Python调用C# Com dll组件的方法详解
  • JavaScript 相关电子书
    学习笔记
    网友NO.865447

    Python调用C# Com dll组件的过程详解

    下面小编就为大家带来一篇Python调用C# Com dll组件实战教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB、CBC、CFB、OFB,这四种用的是RijndaelManaged类),Python下Crypto库AES也只有这四种模式,进而Python下无法实现C# AES Rijndael类加密效果了。 类似于这种C# 能实现的功能而在Python下实现不了的,搜集资料有两种解决方案,第一种方式,使用IronPython 直接调用C# dll文件,教程网上很多,不在赘述了,这种方式有个缺点,用的是ironPython而非Python,只是集成了一些.net framework库的Python版本,更新维护少;第二种方式是,C# dll源码编译成Com组件,Python再调用COM组件Dll的方法。 网上有很多Python调用COM dll教程,但大部分是C或C++编写的dll,很少有比……

    网友NO.984412

    Vue 动态组件components和v-once指令的实现

    一、实现两个组件间互相展示、互相隐藏 !DOCTYPE htmlhtmlhead title动态组件/title script type="text/javascript" src="./vue-dev.js"/script/headbody div id="app" child-one v-if="type=='child-one'" content="child-one"/child-one child-two v-if="type=='child-two'" content="child-two"/child-two button @click="handleChangeEvent"change/button /div script type="text/javascript" Vue.component('child-one', { props: ["content"], template: `div{{content}}/div`, }); Vue.component('child-two', { props: ["content"], template: `div{{content}}/div`, }) var vm = new Vue({ el: '#app', data(){ return{ type:'child-one' } }, methods:{ handleChangeEvent:function(){ this.type= this.type=="child-one" ? 'child-two':'child-one'; } } }) /script/body/html 页面效果图如下: 二、动态组件,简化页面代码 使用:父组件 dom标签使用 ,对组件名称进行绑定 div id="app" !-- child-one v-if="type=='child-one'" content="child-one"/child-one child-two v-if="type=='child-two……

    网友NO.757210

    vue component组件使用方法详解

    什么是组件 按照惯例,引用Vue官网的一句话: 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。 组件component的注册 全局组件: Vue.component('todo-item',{ props:['grocery'], template:'li{{grocery.text}}/li'})var app7 = new Vue({ el:"#app7", data:{ groceryList:[ {"id":0,"text":"蔬菜"}, {"id":1,"text":"奶酪"}, {"id":2,"text":"其他"} ] }}) div id="app7" ol todo-item v-for="grocery in groceryList" v-bind:grocery="grocery" v-bind:key="grocery.id" /todo-item /ol/div 局部注册: var Child = { template: 'divA custom component!/div'}new Vue({ // ... components: { // my-component 将只在父模板可用 'my-component': Child }}) DOM模板解析说明 组件在某些HTML标签下会受到一些限制。 比如一下……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com