asp中的数组怎么在com中传入并解析处理后传出阿~~

crazyboy119 2004-04-01 11:34:55
asp中的数组怎么在com中传入并解析处理后传出阿~~
那位达人指点一下~~
搞了二天了,这个问题还是没有解决~~
我现在要做的是实验数据的回归分析,方程拟合等,急需
这个功能,我对com还不是很了解,希望你可以帮一下我~~
主要就是参数的传递我搞不定,总是出错`~
比如说:
void isqt1(double x[],double y[],int n,double a[2],double dt[6]);//一元回归分析,x[],y[]为输入的原始数据数组,n为数组大小,a[2]和dt[6]为返回值
我想把这个封装在atl做的com中然后用asp来调用
interface ICom : IDispatch
{
[id(1), helpstring("method isqt1")] HRESULT isqt1([in]double x[],double y[],int n,[out,retval]double* a[2],double* dt[6]);
};

在atl里面我对safearray和variant类型都不是很熟,不知道怎么用~
...全文
55 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazyboy119 2004-04-03
  • 打赏
  • 举报
回复
感谢上面两位大虾的帮忙,在你们的帮助下,我已经成功解决这个问题~~
ColderRain 2004-04-02
  • 打赏
  • 举报
回复
HRESULT Proc1(
[in] short m;
[in, size_is(m)] short a[]); // If m = 10, a[10]
HRESULT Proc2(
[in] short m;
[in, size_is(m)] short b[][20]); // If m = 10, b[10][20]
HRESULT Proc3(
[in] short m;
[size_is(m)] short * pshort); /* Specifies a pointer
to an m-sized block of shorts */
HRESULT Proc4(
[in] short m;
[size_is( , m)] short ** ppshort); /* Specifies a pointer
to a pointer to an m-sized
block of shorts */
HRESULT Proc5(
[in] short m;
[size_is(m ,)] short ** ppshort); /* Specifies an
m-sized block of pointers
to shorts */
HRESULT Proc6(
[in] short m;
[in] short n;
[size_is(m,n)] short ** ppshort); /* Specifies a pointer to an
m-sized block of pointers, each
of which points to an n-sized
block of shorts.*/
HRESULT Proc7(
[out] long * pSize,
[out, size_is( , *pSize)] my_type ** ppMyType); /* Specifies a pointer
to a sized pointer,
which points to a block
of my_types, whose size is
unknown when the stub
calls the server. */
LeeZi 2004-04-02
  • 打赏
  • 举报
回复
// VC

HRESULT 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
crazyboy119 2004-04-01
  • 打赏
  • 举报
回复
晕,怎么就没人回复阿
自己顶一下先

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧