在INSIDE ATL书中看到在IDL中如下定义的一个COM方法:
HRESULT GetNextTip([in, out] VARIANT* pvCookie,
                           [out, retval] BSTR* pbstrText);使用时如下调用:
CString& strNext
strNext = (BSTR)(m_tipOfDay->GetNextTip(&vtCookie));不明白为什么可以这样调用?请大家帮着看一看,先谢了。

解决方案 »

  1.   

    [out, retval] BSTR* pbstrText的retval
      

  2.   

    retval表示该参数是返回值,你可以到MSDN中看到详细的解释
      

  3.   

    m_tipOfDay应该是wrapper类,其内部还是以GetNextTip(pvCookie,pbstrText)的形式调用。
      

  4.   

    [in]代表传入参数
    [out,retval]代表传出参数
      

  5.   

    在脚本语言,VB,和JAVA中,带有retval关键字的out参数会被自动映射成函数返回值,而在VC中,不会有这样的映射,仍然返回一个HRESULT,而在你的strNext = (BSTR)(m_tipOfDay->GetNextTip(&vtCookie));中却似乎有了这种映射,所以我断定m_tipOfDay 一定是一个封装类(Wrap类)的指针,他的方法GetNextTip应该类似以下定义:BSTRCMyWrapClass::GetNextTip(VARIANT *pVariant)
    {
       HRESULT hr;
       BSTR bstr;
       hr = GetNextTip(pVariant,&bstr);
       if (hr)
         return bstr;
       else
       {
         //错误处理
         ......
        } } 
     然后定义m_tipOfDay并使用你的代码:
     
     CMyWrapClass m_tipOfDay; CString& strNext;
     strNext = (BSTR)(m_tipOfDay->GetNextTip(&vtCookie)); 事实上这里的强制转换(BSTR)是多余的。 建议你检查一下代码的上下文,是不是类似我说的这样。
      

  6.   

    MFC中好像没有BSTR变量类型吧?