javascript函数如下:
function c(i){
alert("c"+i['2']+i['j']);
}
其中i是一个数组,调用c函数的onclick如下:
<a  id="yy" href="http://www.sina.com/" onclick="c({'2':'y','j':'k'})" target="_blank">新浪</a>在VC的webbrowse中获取了js的
IDispatch *pDispScript = NULL;   
HRESULT hResult;
hResult = pDoc2->get_Script(&pDispScript);hResult   =   pDispScript->Invoke(dispid,IID_NULL, LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispparams,&vResult,&excepInfo,&nArgErr);  请问运行带数组参数的JS函数,dispparams的参数要怎么设置?小弟求求各位高手解决

解决方案 »

  1.   

    javascript我没试, 我用C#调用,用的SafeArray
      

  2.   

    CSDN感觉解决问题的速度很慢啊,是不是高手都不在CSDN啊
      

  3.   

    抄写的
    1. 将数组打包到VARIANT变量里[cpp] view plaincopy
    HRESULT  CXXX::pack(VARIANT *pVariant, long pArgs[], long lCount)     
    {  
       long i;  
       HRESULT hr;  
       VARIANT var;  
       SAFEARRAY* pArray;  
       hr = S_OK;  
       pArray = SafeArrayCreateVector(VT_VARIANT, 0, lCount);  
       if (pArray == NULL){  
         return -1;  
       }  
       VariantInit(&var);   
       var.vt = VT_I4;  
       //如果是字符串数据, 以下转变其数据类型  
       //::VariantChangeType(&var, &var, 0, VT_BSTR);  
       //转变后对相应的参数赋值, var.bstrVal  
       for(i = 0; i < lCount; i++)   
       {   
         var.lVal = pArgs[i];  
         hr = SafeArrayPutElement(pArray, &i, &var);  
         if (FAILED(hr))  
         {   
           SafeArrayDestroy(   pArray   );   
           return   -1;   
         }   
       }  
         
       VariantInit(pVariant);   
       VariantClear(&var);   
       pVariant->vt = VT_ARRAY | VT_VARIANT;   
       pVariant->parray = pArray;  
         
       return 0;  
    }  2. 对为数组类型的VARIANT变量进行解包[cpp] view plaincopy
    // 解包Variant   
    HRESULT CXXX::unpack(VARIANT *pVariant, long pArgs[], long lCount)  
    {  
        long i;  
        HRESULT hr;  
        VARTYPE vt;  
        VARIANT var;  
        SAFEARRAY* pArray;  
          
        i = 0;  
        hr = S_OK;  
        if (pVariant != NULL)  
        {  
          vt = pVariant->vt;  
          pArray = vt & VT_BYREF?*pVariant-> pparray: pVariant-> parray;  
          switch (vt & (VT_I4 | VT_VARIANT))  
          {  
            case VT_VARIANT:  
            {  
              VariantInit(&var);  
              for (i = 0; i < lCount; i++)  
              {  
                hr = ::SafeArrayGetElement(pArray, &i, &var);  
                if (FAILED(hr)){  
                  VariantClear(&var);  
                  return -1;  
                }  
                hr = ::VariantChangeType(&var, &var, 0, VT_I4);  
                if (FAILED(hr)){  
                  VariantClear(&var);  
                  return -1;  
                }  
                pArgs[i] = var.lVal;  
              }  
              VariantClear(&var);  
              break;  
            }  
            case VT_I4:  
            {  
              for (i = 0; i < lCount; i++)  
              {  
                hr = ::SafeArrayGetElement(pArray, &i, &pArgs[i]);  
                if (FAILED(hr)){  
                  return -1;  
                }  
                break;  
              }  
            }  
          }  
        }  
        return hr;  
    }  
      

  4.   

    1。输入数组到COM中
    STDMETHODIMP CTestCom1::vb2vc(VARIANT buffer)
    {
    long dim=SafeArrayGetDim(buffer.parray);
    long ubound;
    long lbound;SafeArrayGetUBound(buffer.parray,dim,&ubound);
    SafeArrayGetLBound(buffer.parray,dim,&lbound);
    BSTR* buf;
    BSTR pd[2];
    SafeArrayAccessData(buffer.parray,(void**)&buf);
    for (int i=lbound;i<ubound;i++)
    pd[i]=buf[i];
    }
    return S_OK;
    }buffer为一维数组,存放字符串,在vb中的代码为
    Dim oo As ARRAYTESTLib.TestCom1Set oo = New ARRAYTESTLib.TestCom1Dim buf(2) As Stringbuf(0) = "65"
    buf(1) = "anss"
    oo.vb2vc buf2。COM返回数组数据到vbSTDMETHODIMP CTestCom1::retarray(VARIANT *buffer)
    {
    //返回数组
    SAFEARRAY FAR* psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound=0;
    rgsabound[0].cElements=2;
    psa=SafeArrayCreate(VT_I4,1,rgsabound);long idx;
    long setdt;idx=0;
    setdt=12;SafeArrayPutElement(psa,&idx,&setdt);
    idx=1;
    setdt=342;
    SafeArrayPutElement(psa,&idx,&setdt);V_VT(buffer) = VT_ARRAY | VT_I4;
    V_ARRAY(buffer)=psa;return S_OK;
    }
      

  5.   

    那么怎么把{'2':'y','j':'k'} 这个数组弄成safearray?
      

  6.   

    你在javascript中搞一个数组,直接传给接口就行了。比如
    在C#中
    object arr = new object[];
    obj.vb2vc(arr);多试吧。
      

  7.   

    楼主, 如果你不能修改当前JS的话, 那你是没办法将数组传给JS的函数'C'的, 如果你可以修改JS的话, 你可以这样做, 从C++中传JSON的字符串过来 数组就是'[1, 2, 3]', 然后用JS的EVAL函数可以得到数组