描述:
情况如下,
我用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
%>
____________________
先谢谢各位了!!!!
解决方案1:
gz
解决方案2:你不返回VARIANT* 返回 SAFEARRAY*试试
解决方案3: 应该是返回值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;
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
%>
看看这样是否正常
>>Response.write "<BR>"&x&": "&OutStr(x)
改为:Response.write "<BR>"&x&": "&OutStr&x
试试
不过我估计不是这个原因,依次在每个语句后用Response.End测试是哪个语句出的问题