描述:
ATL控件用参数返回数据的问题
在控件ATLctl中有一个方法:getID()
idl的定义为:
[id(4), helpstring("method getID")]
HRESULT getID([in,out]short *n, [out, retval]BSTR *pVal);
ATLctl.h的定义为:
public:
STDMETHOD(getID)(/*[in,out]*/short *n,/*[out, retval]*/BSTR *pVal);
ATLctl.cpp的实现为:
STDMETHODIMP ATLctl::getID(short *n,BSTR *pVal)
{
// TODO: Add your implementation code here
*n=100;
BSTR bstr1=_com_util::ConvertStringToBSTR("ID数据");
*pVal=bstr1;
return S_OK;
}
在HTML中:
<script>
function window.onload(){
var n=6
alert(ATLctl.getID(n))//显示“ID数据”,是对的
alert(n)//显示“6”,说明没有返回数据;
</script>
请问,问题出在那里?
解决方案1:
需要将[in,out]short *n 改写成为[out,retval]short *n; retval表示作为函数的返回值返回,但是一个函数好像只能有一个返回值,所以楼主要不再写一个接口函数用来返回n的值,或者将n的值和字符串“ID数据”捆绑在一起返回,然后再分析返回的字符串获得n的值
解决方案2: 严格意义上,javascript中,行参与实参之间只有值传递,没有传指针(地址)的概念,只是当实参是一个对象时,行参与实参之间传递的值是这个对象的“句柄”而已。我们习惯称之为:引用传递。这一点和c是要区分开的。
上边的变量:var n = 6; //这个n必须是个Object类型才行
所以,你可以试着改成:var n = new Object();
ATLctl.getID(n) //getID的参数是个指针,不是值,这样做是传值
script我不懂,但是你这里的n是形参传不回来值的,如果在C++中应该这样调用:
long n = 0;
ATLctl.getID(&n); //这样是传址
你可以试一试...
short *n 改成:long *n 试一试...
http://www.china-askpro.com/msg49/qa64.shtml
解决方案6: 如果楼主的函数是下面形式
ATLctl.h的定义为:
public:
STDMETHOD(getID)(/*[in]*/short n,/*[out, retval]*/BSTR *pVal);//不让n成为指针
STDMETHODIMP ATLctl::getID(short n,BSTR *pVal)//不让n成为指针
{
// TODO: Add your implementation code here
n=100;
BSTR bstr1=_com_util::ConvertStringToBSTR("ID数据");
*pVal=bstr1;
return S_OK;
}
在VB脚本中采用下面形式可以得到"ID数据"字串
Set obj = CreateObject("xxx.xxx")
Dim Temp
Temp= obj.getID(12)
MsgBox Temp
Set obj = nothing
所以,建议楼主试试在返回值 (/*[out, retval]*/ )
用结构(或者是结构的指针)来返回多个结果