描述:
dim ss
dim LastErr
set ss = Server.CreateObject("xing.aaa")
ss.func "aaa","bbb"
LastErr = ss.GetLastError
set ss = nothing
LastErr
----------------------------
如何让 ATL 返回一个字符串,比如:“参数1类型不正确!”
用 Method 还是 Property?函数是什么返回类型?
谢谢!
解决方案1:
[propget, id(14), helpstring("property GetLastErrorDesc")] HRESULT GetLastErrorDesc([out,retval] BSTR* ret_val, [out, retval] BSTR *pVal);
STDMETHODIMP CControl::get_GetLastErrorDesc(BSTR *ret_val, BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
ret_val = "出错误了!";
return S_OK;
}
然后就报错误:
----------------------------------------------------------------------
invalid use of "retval" attribute : [ Parameter 'ret_val' of Procedure 'get_GetLastErrorDesc' ( Interface 'IControl' ) ]
=================================================
除了上边帖子说的不能用两个retval以外,你的
ret_val = "出错误了!";
写法也不正确,可能会引起内存异常的
标准写法是
*ret_val = SysStringAlloc(L"出错误了!");
或者类似的如,CComBSTR,_bstr_t的copy函数等
说得好!retval属性的含义是,相关联的物理方法参数实际上是操作的逻辑结果,在支持retval的环境中,各参数应该被映射成为操作的结果。
eg : HRESULT Method2([in] short argl,[out,retval]short *parg2);
在java语言中,应给被映射为下面
public short Method2(short argl);
vb中:
Function Method2(argl as Integer)As Integer
你想一想,只可能有一个返回值!哈哈
retval只能又一个,他是指明当如str = obj.GetLastErrorDesc( pr1 )调用时,str被哪个返回参数赋值,只是用于脚本即VB等这类语言函数调用的简化而已。
所以retval必须只能有一个而且是最后一个参数的属性。
楼主上面的ret_val = "出错误了!";是错的,因为ret_val是BSTR的指针,不是BSTR(即使是也不能这样编写),应改成
*ret_val = SysAllocString( L"出错误了!" );
例子: HRESULT GetName([in]int port , [out,retval] BSTR*bstr);
JScript调用时str = obj.GetName(1)