头要爆老,(关于ASP中用VBSCript,向自编COM传参数的问题??????)

shudingbo 2003-10-16 05:45:54
情况如下,
我用VC编有一COM组件,内一接口,某函数,需要传入字符串数组。
我用VB能够很好的调用,并能得到正确结果。但是,在ASP中使用VBScript
来调用时,却说“服务器出现意外情况”,不能执行。请问为什么??
VC
______________

IDL:[id(3), helpstring("GetProData")] HRESULT GetProData([in]int iProType, [in]VARIANT Parames,[out,retval]VARIANT *pReturn);


STDMETHODIMP CUnRealDraw::GetProData(int iProType, VARIANT Parames, VARIANT *pReturn)
{
// Get the parames
_bstr_t tt;
tt="into the param it";

HRESULT hr=S_OK;
long lStartBound =0;
long lEndBound = 2;

hr = SafeArrayGetLBound(Parames.parray, 1, &lStartBound);
hr = SafeArrayGetUBound(Parames.parray, 1, &lEndBound);

SAFEARRAYBOUND safeBound[1];
SAFEARRAY* pOutArray;
safeBound[0].cElements = lEndBound-lStartBound+1;
safeBound[0].lLbound = 0;
pOutArray = SafeArrayCreate(VT_VARIANT,1,safeBound);


for(long iIndex = lStartBound; iIndex <= lEndBound; iIndex ++)
{

VARIANT varFlavor;
VariantInit(&varFlavor);

hr = SafeArrayGetElement(Parames.parray,&iIndex, &varFlavor);
if(hr != S_OK)
{
tt="error,can't find the value";
}
if(varFlavor.vt == VT_I4 )
{
long lsz = varFlavor.lVal;
}
if(varFlavor.vt == VT_BSTR )
{
_bstr_t bstrOut(varFlavor.bstrVal);
CComVariant variantFlavor(SysAllocString(varFlavor.bstrVal));
SafeArrayPutElement(pOutArray,&iIndex,&variantFlavor);

tt= bstrOut;
}

}//for loop

//......
//.......
//return the VARIANT
V_VT(pReturn)=VT_ARRAY | VT_VARIANT;
V_ARRAY(pReturn) = pOutArray;

return S_OK;
}



____________________
VB
_______________
Dim tt As UnRealDraw
Set tt = New UnRealDraw
Dim InVar(4)
Dim inn
inn = 12
InVar(0) = "sssss"
InVar(1) = "lava_sdb"
InVar(2) = " nihao"
InVar(3) = "ss"
InVar(4) = "dd"
'Dim filesize

Dim OutStr
Dim szOut As String

OutStr = tt.GetProData(1, InVar)
For x = LBound(OutStr) To UBound(OutStr)
szOut = szOut + OutStr(x)
Next

MsgBox szOut


____________________



********************
VBScript(ASP)
_______________
<%
Set objArray= Server.CreateObject("YWPT.UnRealDraw")
InVar=Array("lava_sdb"," nihao")

'InVar(1)="lava_sdb"
'InVar(2)=" nihao"
'Dim filesize
Dim OutStr


OutStr = objArray.GetProData(1, InVar)

for x= LBound(OutStr) to UBound(OutStr)
Response.write "<BR>"&x&": "&OutStr(x)
next

Set objArray= nothing

%>
____________________

先谢谢各位了!!!!

...全文
54 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hanzo 2003-10-18
  • 打赏
  • 举报
回复
gz
flyingjust 2003-10-17
  • 打赏
  • 举报
回复
你不返回VARIANT* 返回 SAFEARRAY*试试
ayqlj 2003-10-17
  • 打赏
  • 举报
回复
楼上的方法不错
shudingbo 2003-10-17
  • 打赏
  • 举报
回复
搜索以前帖子得到答案
感谢 masterz(MS MVP)
_____________________


STDMETHODIMP CUnRealDraw::GetProData(int iProType, VARIANT Parames, VARIANT *pReturn)
{
_bstr_t bstmp;
VARIANT* varArray;

SAFEARRAYBOUND safeBound[1];
SAFEARRAY* pOutArray;

if(Parames.vt == (VT_VARIANT | VT_BYREF))
{
varArray = Parames.pvarVal;
}
else
{
varArray = ¶mes;
}

//if(varArray->vt == VT_ARRAY | VT_BYREF | VT_VARIANT)
//{
VARIANT *strArray;
SAFEARRAY *psa = varArray->parray;

SafeArrayAccessData(psa,(void **)&strArray);

UINT uDim = SafeArrayGetDim(psa);
if(1 == uDim)
{
HRESULT hr=S_OK;
long lStartBound =0;
long lEndBound = 2;
hr = SafeArrayGetLBound(psa, 1, &lStartBound);
hr = SafeArrayGetUBound(psa, 1, &lEndBound);


safeBound[0].cElements = lEndBound-lStartBound+1;
safeBound[0].lLbound = 0;
pOutArray = SafeArrayCreate(VT_VARIANT,1,safeBound);

for(long iIndex=lStartBound;iIndex<=lEndBound;iIndex++)
{
if(strArray[iIndex].vt == VT_BSTR)
{
CComVariant variantFlavor(SysAllocString(strArray[iIndex].bstrVal));
SafeArrayPutElement(pOutArray,&iIndex,&variantFlavor);
}
else if(strArray[iIndex].vt == VT_EMPTY)
{
CComVariant variantFlavor("element%d is empty");
SafeArrayPutElement(pOutArray,&iIndex,&variantFlavor);
}
}
//}
//else
//{
// bstmp = "wrong dimension number";
//}
SafeArrayUnaccessData(psa);

}


V_VT(pReturn)=VT_ARRAY | VT_VARIANT;
V_ARRAY(pReturn) = pOutArray;

return S_OK;
}

————————————————
???按理说原来的方法也应该能行!但是为什么不行!
:-)等我有了结果再结帖。
microran2000 2003-10-17
  • 打赏
  • 举报
回复
应该是返回值VARIANT *pReturn出了问题,以前我在调试ASP组件经常出现这些问题,ASP组件采用VB测试,完全正常,但是对于ASP环境下采用脚本调用老是pReturn返回出错.于是我就发现,如果是返回的VARIANT 类型变量是一个BSTR类型,就单独为它采用SysAllocString分配一个空间,VT采用BSTR
pReturn->bstrVal=SysAllocString("....");
pReturn->VT=VT_BSTR;
对于VARIANT是其他类型的情况.干脆定义一个VARIANT成员变量.这个变量的初始化放在构造函数中.变量的释放放在析构函数中.方法调用时把这个变量的地址直接赋值给pReturn;
pReturn=&m_vValue;
shudingbo 2003-10-17
  • 打赏
  • 举报
回复
-----------------------
错误信息
_______________________

Microsoft VBScript 编译器错误 错误 '800a03f6'

缺少 'End'

/iisHelp/common/500-100.asp,行242 错误 '80010105'

服务器出现意外情况。

/project1/getProData.asp,行17
shudingbo 2003-10-17
  • 打赏
  • 举报
回复
谢谢先,
我试过了,不行。
错在调用GetProData(...)函数上,
只要我在该函数中加入对输入的Parames的操作,如取边界、取元素等都会出错。
不解,
是VB中数组与VBScript不同吗?在MSDN上也没找到相关文章或事例!!
郁闷++
ayqlj 2003-10-17
  • 打赏
  • 举报
回复
VBScript(ASP)
_______________
<%
Set objArray= Server.CreateObject("YWPT.UnRealDraw")
InVar=Array("lava_sdb"," nihao")

'InVar(1)="lava_sdb"
'InVar(2)=" nihao"
'Dim filesize
Dim OutStr


OutStr = objArray.GetProData(1, InVar)
Set objArray= nothing

%>
看看这样是否正常
shudingbo 2003-10-17
  • 打赏
  • 举报
回复
不是pReturn 的问题,
只要我把函数中 针对 Parames 操作的语句注释掉,
就可以执行了!(但肯定不是我想要的结果 :-) )
--------
我的想法是传递进一个数组,该数组的元素的类型是不定的,是Variant
--------
>>microran2000(什么时候才能看到星星?)
xiaohyy 2003-10-16
  • 打赏
  • 举报
回复
>>Response.write "<BR>"&x&": "&OutStr(x)

改为:Response.write "<BR>"&x&": "&OutStr&x

试试

不过我估计不是这个原因,依次在每个语句后用Response.End测试是哪个语句出的问题

3,245

社区成员

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

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