求一个vc控件返回数组给asp程序的例子希望能用 ATL ACTIVE SERVER PAGE CLASS 写一个 控件  传递一个数组给asp 让asp通过方法 读取出来

解决方案 »

  1.   

    HRESULT GetArray(VARIANT* pVal)

        LONG Count;
        _variant_t v;
        v.vt = VT_VARIANT | VT_ARRAY;
        v.parrsy = ::SafeArrayCreateVector(VT_VARIANT, 0, Count);
        //填写数据
        //...    *pVal = v.Detach();
        return S_OK;
    }
      

  2.   

    // VCHRESULT isqtl([in] VARIANT x, [in] VARIANT y, [out, retval] VARIANT* out);isqtl(VARIANT x, VARIANT y, VARIANT *out)
    {
    if (out == NULL)
    return E_POINTER; if (x.vt != (VT_VARIANT | VT_BYREF))
    return E_INVALIDARG; if (!(x.pvarVal->vt & VT_ARRAY))
    return E_INVALIDARG; if (y.vt != (VT_VARIANT | VT_BYREF))
    return E_INVALIDARG; if (!(y.pvarVal->vt & VT_ARRAY))
    return E_INVALIDARG; SAFEARRAY* pX = NULL;
    SAFEARRAY* pY = NULL; if (x.pvarVal->vt & VT_BYREF)
    pX = *(x.pvarVal->pparray);
    else
    pX = x.pvarVal->parray; if (y.pvarVal->vt & VT_BYREF)
    pY = *(y.pvarVal->pparray);
    else
    pY = y.pvarVal->parray; if (::SafeArrayGetDim(pX) != 1)
    return E_INVALIDARG;
    if (::SafeArrayGetDim(pY) != 1)
    return E_INVALIDARG; LONG LBound, UBound;
    ::SafeArrayGetLBound(pX, 1, &LBound);
    ::SafeArrayGetUBound(pX, 1, &UBound);
    LONG Count = UBound - LBound + 1;
    ::SafeArrayGetLBound(pY, 1, &LBound);
    ::SafeArrayGetUBound(pY, 1, &UBound);
    if ((UBound - LBound + 1) != Count)
    return E_INVALIDARG; vector<DOUBLE> vx;
    vector<DOUBLE> vy; _variant_t v;
    VARIANT* pvData = NULL;
    ::SafeArrayAccessData(pX, (void**)&pvData);
    for (LONG i=0; i<Count; ++i)
    {
    v = pvData[i];
    v.ChangeType(VT_R8);
    vx.push_back(v.dblVal);
    }
    ::SafeArrayUnaccessData(pX); ::SafeArrayAccessData(pY, (void**)&pvData);
    for (i=0; i<Count; ++i)
    {
    v = pvData[i];
    v.ChangeType(VT_R8);
    vy.push_back(v.dblVal);
    }
    ::SafeArrayUnaccessData(pY); v.Clear();
    v.vt = VT_VARIANT | VT_ARRAY;
    v.parray = ::SafeArrayCreateVector(VT_VARIANT, 0, 8); VARIANT* pd = NULL;
    ::SafeArrayAccessData(v.parray, (void**)&pd);
    pd[0] = _variant_t(vx[0]).Detach();
    pd[1] = _variant_t(vx[1]).Detach();
    pd[2] = _variant_t(vy[0]).Detach();
    pd[3] = _variant_t(vy[1]).Detach();
    pd[4] = _variant_t(vy[2]).Detach();
    pd[5] = _variant_t(vy[0]).Detach();
    pd[6] = _variant_t(vy[1]).Detach();
    pd[7] = _variant_t(vy[2]).Detach();
    ::SafeArrayUnaccessData(v.parray); *out = v.Detach();
    return S_OK;
    }//我直接取X的前两个,重复取Y的前三位返回,具体的自己写吧。
    //应该还有错误处理,我省了。
    ========================================================================
    //asp
      Dim obj
      set obj = CraeteObject(...)  Dim a(4)
      For I = 0 To 4
         a(I) = I + 1
      Next  Dim b(4)
      For I = 0 TO 4
         b(I) = I * I
      Next
      
      dim Sum
      Sum = obj.isqtl(a, b)  if (IsArray(sum)) Then
    for j = LBound(sum) To UBound(sum)
    Response.Write CStr(sum(j)) & "<BR>"
    Next
      End if