COM中[int],[out],[out,retval]的含义

COM中在声明函数中通常会这样:

HRESULT getName([in]int ID,[out,retval]*BSTR name)

实现函数时,这样:

STDMETHODIMP Person::getName([in]int ID,[out,retval]*BSTR name)

{

    ........

    *name='zhang san';

    return S_OK;

}

这里的[out,retval]限定符表示,参数name是作为一个输出参数存在的,且这个参数是作为一个返回值。什么意思呢?

我们知道,对于c++中的普通函数而言,函数计算出来的值是可以直接返回的。但是在COM中,返回值只能是HRESULT类型。这个返回值表示函数运行过程中内部是否发生了错误。

供调用者检查运行是否出错的。那么函数真正的返回值只能以指针的形式返回给由[out]限定的指针类参数了。

但是,我们仍然想在COM中拥有像普通函数那样直接返回返回值的能力怎么办?

[out,retval]限定符修饰的参数就可以使函数直接返回我们所需要的参数。

所以上面的函数可以这么用:

BSTR* name;

name=getName(1617344);

第二个参数直接被返回来了。

注意:1.[out,retval]限定符在一个函数中只能有一个,且必须放置在最后一个参数位置上。

           2.无论是[out]还是[out,retval],所修饰的参数必须是指针参数,因为普通参数在函数调用完毕后就被销毁了,并不能得到返回值。

           3.个人习惯,能不这么用,尽量别这么用,直接用[out]限定符就可以了。

原文地址:https://www.cnblogs.com/zhuluqing/p/8572830.html