求一个vc控件返回数组给asp程序的例子 求一个vc控件返回数组给asp程序的例子希望能用 ATL ACTIVE SERVER PAGE CLASS 写一个 控件 传递一个数组给asp 让asp通过方法 读取出来 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;} // 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 使用ATL的问题 请教PPPoE server 端实现的原理! 真是郁闷,我给人做程序,那人不给钱。 一个很奇怪的问题 ie 编程, GetCount : is not a member of 'IShellWindows' , 如何实现隐藏分割条? 我开发了一款网络类软件,发布,经营了近一年,但现在的结果是:我想放弃了。。。 如何將對話框程式的界面設置為始終在各windows界面的頂層? (100分)向高手请教一个关于ActiveX 控件的接口制作问题 include函数可否包含一个文件? 多文档的问题~~ 急且简单:如何读整个file放入一条CString中
{
LONG Count;
_variant_t v;
v.vt = VT_VARIANT | VT_ARRAY;
v.parrsy = ::SafeArrayCreateVector(VT_VARIANT, 0, Count);
//填写数据
//... *pVal = v.Detach();
return S_OK;
}
{
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