zoukankan      html  css  js  c++  java
  • COM中获取JavaScript数组大小

    JavaScript调用COM传递数组时,在COM接口端,接收到的是VARIANT类型对象,如array,该对象的vt类型VT_DISPATCH,因此其值表示的是一个IDispatch类型的指针。

    IDispatch类型的指针,则表明该数组对象实际是一个JavaScript的内建数组对象,在JavaScript端,我们可以通过length属性来得到数组的大小,那么在此处,可以通过GetIDsOfNames函数和Invoke函数来获取数组长度,这样可以动态变量数组内容。

        // 获取数组长度
        BSTR bstrLength = L"length";
        DISPID dispid;
        hr 
    = lpDispatch->GetIDsOfNames(IID_NULL, &bstrLength, 1,
                LOCALE_USER_DEFAULT, 
    &dispid);
        
    if ( SUCCEEDED(hr) )
        {
            CComVariant varResult;
            hr 
    = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
                DISPATCH_PROPERTYGET, 
    &noArgs, &varResult, NULL, NULL);
            
            
            
    if ( varResult.vt == VT_I4)
            {
                nLength 
    = varResult.intVal;
            } 

        } 

     这个时候,nLength获得得到的就是数组的长度。

    在JavaScript中的数组时一个对象,数组内容则是该对象的属性,是动态被创建的,这些属性的查询方式与length的查询方式有些类似,也是GetIDsOfNames和Invoke函数,主要差别在于名字的区别,数组中元素对象的属性,其名字是动态创建,也就是可以通过下标方式方式获取,因此,在此处,也可以通过下标方式获取该属性名称,具体如下:

        for ( int i=0; i<nLength; ++i)
        {
            CComVariant vaIndex(i, VT_I4);
            vaIndex.ChangeType(VT_BSTR);
            DISPID dispid;
            hr 
    = lpDispatch->GetIDsOfNames(IID_NULL, &vaIndex.bstrVal,1,
                    LOCALE_USER_DEFAULT, 
    &dispid);

            
    if ( FAILED(hr) )
            {
                
    continue;
            }

            CComVariant varResult;
            hr 
    = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
                    DISPATCH_PROPERTYGET, 
    &noArgs, &varResult, NULL, NULL);
            
            VARTYPE vt 
    = varResult.vt;
            
    if (vt == VT_DISPATCH )
            {
                InvokeArray( varResult );
                
    continue;
            }

            hr 
    = varResult.ChangeType(VT_BSTR);
            CComBSTR bstrVal 
    = varResult.bstrVal;

            } 

    于是通过这两种属性方式的调用,就可以在COM接口中便利所有的JavaScript数组对象了。

    这个有什么好处呢,在查看很多网上资源的时候,发现大部分采用SAFEARRAY方式对结构体进行处理,传入到COM接口中,但SAFEARRAY在MIDL中并不被支持,而且JavaScript对象本身也不支持这个内容,要对SAFEARRAY方式操作,需要切换VBScript和JavaScript两种语言,这会导致程序编写的困难和维护人员的困惑。

    直接采用JavaScript方式传入数组,对数组任意方式进行整合,就不需要通过SAFEARRAY方式进行结构体整合。同时,由于JavaScript中的每一个对象(元素)都带有本身的类型信息,因此,JavaScript中的数组时C中结构体的最佳替代方式(传递方式)。

    附注:

         今天在google的时候,发现已经有人在商用网站上用了这一篇文章,但居然没有给出出处,有些愕然与意外! 

         本文出处: http://www.cnblogs.com/ubunoon/archive/2009/11/20/COM_JAVASCRIPT.html 


         本文可以转载,但必须标识出处!特此声明,保留版权!


  • 相关阅读:
    nano编辑器__vi常用命令
    pyCharm最新2018激活方式(记录)
    一、centos7.4安装docker
    C#备份及还原数据库的实现
    System.Drawing.image 与ImageSource 互转
    Socket 异步通信
    图片与base64的互转
    程序中编写log日志
    SQLHelper
    Cond
  • 原文地址:https://www.cnblogs.com/ubunoon/p/COM_JAVASCRIPT.html
Copyright © 2011-2022 走看看