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 


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


  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/ubunoon/p/COM_JAVASCRIPT.html
Copyright © 2011-2022 走看看