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对象广泛使用这个方法。

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

时间: 2017-02-21

Python编写的com组件发生R6034错误的原因与解决办法

解决该问题的方法可以为调用本程序的exe文件建立一个合适的manifest文件,指定正确的msvcr90.dll版本即可,具体可参照http://www.jb51.net/article/35219.htm ps:可以使用mt.exe进行导出或合并manifest资源到exe或者dll文件. 查看manifest的方法:mt -inputresource:pythoncom27.dll;#2 -out:sss.txt 合并manifest到dll的方法: mt.exe –manifest MyA

vbs TLI.TLIApplication 被遗忘的COM组件

曾经一直很好奇VbsEdit的代码自动补全是怎么实现的,现在看来,大约的确用的就是这个COM. 比如我想知道scrrun.dll(提供fso对象的dll)这个COM组件提供了哪些接口,可以用下面的代码: 复制代码 代码如下: Set tli = CreateObject("TLI.TLIApplication") Set Info = tli.TypeLibInfoFromFile("scrrun.dll") For Each Interface In Info.I

用JavaScript编写COM组件的步骤

支持这些接口的脚本语言有:JavaScript/JScript.VBScript.Perl和Python等. WSC有以下特点.  小巧高效:  易于创建.维护和部署:  提供了创建COM部件的能力:  提供了访问大量系统服务的能力. 用JavaScript编写COM组件的核心工作是完成一个.wsc(Windows Scripting Component)文件..wsc文件是一种标准的XML文件,其格式如下: <?xml version="1.0" encoding=&q

asp中COM组件中如何连接数据库的代码

VB- 工程 -引用 - ADO 2.0 ,建一个类DB,工程名设为 SQLCONN 以下是偶程序中的部分代码,大家有空可以试试 Option Explicit Public strError As String Public Conn As New ADODB.Connection Public Rs As New ADODB.Recordset Public Property Get ErrorString() As String ErrorString = strError End Pro

在jsp程序中使用com组件

在jsp程序中使用com组件的机会并不多,jsp也没有直接操作com的函数,但有的工作有时候还必须使用com组件来完成,下面就来说一下具体的操作方法. 在jsp中使用com组件有两种方法:一种是用javascript在客户端来控制(严格说这个应该是html的功能),如: <OBJECT id="myCom" classid="clsid:9D8A2E2F-D38F-CDAC-D0C5-5B3FB2275442" codebase=".com/com.

PHP调用VC编写的COM组件实例

一.用VC创建COM组件 1.vc新建项目 -> ATL项目,输入名称ComTest,ComTest将作为COM组件的名称. 2.到了ATL项目向导,不需要改动,完成向导.向导完成后,vc将会自动生成一系列的程序. 3.切换到类视图,在ComTest项右键,添加类,选择ATL简单对象, 4.来到ATL简单对象向导,输入你要新建的类名 MyClass,完成向导.(注意了,还要填写ProgID,有些vs会自动补全) 5.回到类视图中,在IMyClass右键,添加方法,将会进入添加方法的向导. 6.来

C++中COM组件初始化方法实例分析

本文实例讲述了C++中COM组件初始化方法.分享给大家供大家参考.具体如下: 这里使用BCB 在使用TADOConnect等组件时需要进行初始化 调用接口 : CoInitialize(NULL);//初始化COM套件 CoUninitialize();//释放COM套件 在DLL入口中调用: static bool isCoInitialize = false; //是否是自己进行的初始化 int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned l

Yii扩展组件编写方法实例分析

本文实例讲述了Yii扩展组件编写方法.分享给大家供大家参考.具体如下: 因为Yii本身就引入了Prado的component-based 思想做为主要思想.因此,组件在yii中是很重要的. 组件一般放在components目录里,其格式示例基本如下: <?php /** * some description about the <span style="color: rgb(34, 34, 34); font-family: Arial, sans-serif; font-size:

python中base64加密解密方法实例分析

本文实例讲述了python中base64加密解密方法.分享给大家供大家参考.具体分析如下: 一.base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同.编码后的

jsp中Action使用session方法实例分析

本文实例分析了jsp中Action使用session方法.分享给大家供大家参考.具体如下: 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到 1.通过ActionContext class中的方法getSession得到 2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到session的例子 复制代码 代码如下: p

thinkPHP中钩子的使用方法实例分析

本文实例讲述了thinkPHP中钩子的使用方法.分享给大家供大家参考,具体如下: 前面介绍过thinkPHP中钩子的两种配置调用方法,这里来进一步分析一下钩子的使用方法. 1 创建钩子行为: 我们自己定义的标签位可以直接放在Think\Behaviors中,也可以放在应用目录中,比如说Home模块下,新建一个Behaviors的文件夹,在文件夹内新建 标签名+Behavior.class.PHP 注:需要带Behavior的原因,见代码: static public function exec(

jquery中ajax跨域方法实例分析

本文实例分析了jquery中ajax跨域.分享给大家供大家参考,具体如下: JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 方法一: jsonp之 getJSON js var url = "http://localhost/mytest/jsonp_php.php?callback=?"; $.getJSON(url, { "age": 21, "name

Android中TelephonyManager类的方法实例分析

本文实例讲述了Android中TelephonyManager类的方法.分享给大家供大家参考.具体如下: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取相关数据. TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯

mysql中GROUP_CONCAT的使用方法实例分析

本文实例讲述了mysql中GROUP_CONCAT的使用方法.分享给大家供大家参考,具体如下: 现在有三个表,结构如下: cate表: CREATE TABLE `cate` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `name` char(20) DEFAULT '' COMMENT '分类名', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAUL

YII2框架中添加自定义模块的方法实例分析

本文实例讲述了YII2框架中添加自定义模块的方法.分享给大家供大家参考,具体如下: 有些时候系统功能过于复杂,这时我们需要通过模块把一些功能区分开来,便于管理与维护. 我用的是Yii2的基本应用程序模板,程序其实已经给我们提供了一个模块,就是app本身.YII2中是可以无限嵌套模块的.不过一般不要超过2层. 我们在app下创建一个modules的目录,并创建一个api子目录,子目录下创建Api.php文件. Api.php代码如下: <?php namespace app\modules\api

PHP中常用数组处理方法实例分析

1.array_shift()将数组的第一个单元移出再返回,这对有时候数组的第一个单元要单独处理很方便. 复制代码 代码如下: <? $tmparray = array("1", "2", "3", "4"); $tmparray = array_shift ($tmparray); print_r($tmparray); ?> 2.array_chunk() 将一个数组分割成多个数组 ,后面参数控制数组单元数目.