全国服务热线:0776-5859998
消息中心在线申请微营销

COM中获取JavaScript数组大小

:2015-06-13 11:48     阅读数:     分享到:

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中结构体的最佳替代方式(传递方式)。


新案例
新签约
  1. 乾涵科技-高薪招聘网站PHP程序员...
  2. 成功签约广州市标准化协会网站建设协议...
  3. 成功签约佛山市领缝缝纫设备有限公司网...
  4. 成功签约深圳市创景轩园林工程有限公司...
  5. 成功签约广州狮子婴幼公学网站建设协议...
  6. 广州名阳建筑设计有限公司网站建设项目...
  7. 成功签约佛山市其乐教育投资有限公司网...
  8. 成功签约广州力恩普投资管理有限公司网...
新资讯
  1. 苹果所持现金可买Groupon+Twitter+Zynga...
  2. 世纪佳缘盈利模式受质疑 面临社交网站冲...
  3. 今年北京将采取更严厉手段打击盗版...
  4. 开心网收缩团购突裁百余人 一天内先签约...
  5. 开心网回应团购调整争论:必将负责到底...
  6. Twitter着力提升移动体验 看好HTML5长远前景...
  7. 破除有关Google面试的谣言...
  8. Windows 8也能“穿越”了...