zoukankan      html  css  js  c++  java
  • COM 参数有in, out ,retval

    COM 参数有in, out ,retval

    来源:http://blog.sina.com.cn/s/blog_472a9f0c01017uer.html 

      In 输入参数,它的值不被返回  
      Out 输出参数,必须是一个成员指针,将返回结果  
      RetVal 返回值,返回的值不能显示到用户向导中

      
      就Out,RetVal,都是返回值,具体区别在哪?
    • RetVal只是Out的一种特殊情况,对于wrapper class在碰到RetVal时,会将其作为一个返回值来处理,对调用方就可以直接拿它当函数的返回值,而不需要再用一个传出参数来接收返回的信息。
    • 在一个过程或函数当中RetVal,最多只能有一个。但是Out/in可以有多个(当然也不是无限的)。
    • [out,retval]表示参数方向是输出,同时可以作为函数运算结果的返回值。一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。
    • [in]类型表明参数是一个输入参数,所以这个参数不会向外界返回结果
      [out]类型表明参数是个输出参数,所以这个参数会向外界返回结果,而且传入参数时,可以将变量设置为NULL
      [out,retval]类型表明参数是个输出参数,且会返回类中数据成员的值
    • 那么从[out],[retval]类型的参数可以获取参数改变后的值,则函数的执行结果从函数的返回类型HRESULT来获得

    使用ATL创建COM组件时,需要标明参数的类型为[in]、[out]或者[out,retval]。
    通过Init方法返回一个BOOL型变量,
    在IDL中的代码是:
    HRESULT Init([out,retval]BOOL* result);
    函数体为:
    STDMETHODIMP CBrowserAD::Init(BOOL *result)
    {
    ...
    *result = true
    return S_OK;
    }
    在COM客户端,这样使用的:
    首先定义 BOOL* t;

    得到Init函数中的返回值*result:

    用2的方法,类型转换一下就可以了:

    *t = (BOOL)m_BrowserAD->Init();
  • 相关阅读:
    毛笔算法 毛笔签名效果
    手写输入控件
    全栈工程师成长路线
    配置msdtc
    流行的广告轮播(图片轮播)JS代码!!
    水晶报表放上去网站会爆:bobj错误的
    查询所有存储过程
    VB.NET and C# Comparison
    SQL查询案例:多行转换为一行
    SQL Server行列转换[转]
  • 原文地址:https://www.cnblogs.com/vedgtar/p/3613552.html
Copyright © 2011-2022 走看看