COM:总是需要方法参数属性?

时间:2013-10-08 18:33:20

标签: c++ visual-c++ com atl

我有和ATL简单的对象接口名为ISimpleCom。 该对象实现连接点。 我想知道为什么“普通”COM方法参数必须以和属性为前缀,但事件方法不是?

ISimpleCom方法:

[id(1)] HRESULT Calculate([in] VARIANT_BOOL a_bFireEvent, [out,retval] LONG* a_lTotalMarks);

_ISimpleComEvents方法(事件“签名”,注意“a_lTotalMark”的参数未被归因): [id(1)] HRESULT TotalMarks(LONG a_lTotalMarks);

Fire_TotalMarks(12); <-- will fire the event in my case to C# manage code

2 个答案:

答案 0 :(得分:1)

参数属性magic是explained on MSDN here

  

[in]属性有一个converse属性,[out],表示   一个参数将从被调用的过程返回到   呼叫程序。 [in]和[out]属性称为   方向参数属性,因为它们指定了方向   传递哪些参数。参数可以定义为[in],   [out],或[in,out]。

     

[in]属性标识由编组封送的参数   客户端存根,用于传输到服务器。

     

缺省情况下,[in]属性默认应用于参数   指定了方向参数属性。

以下简要说明如下:

  • 参数为inoutin/out,无方向参数没有意义,因此如果省略属性,[in]仍然适用;你不必放[in],但为了清晰起见,这是一个好主意
  • 这些参数定义参数值传输的方向,当涉及编组和其他传输时,当呼叫假设某些传输在呼叫者/被呼叫者的方式时

答案 1 :(得分:0)

COM中的属性是COM运行时关于它可以进行优化的提示。例如,如果param被标记为[in],则运行时知道它不必为返回值分配任何内存。如果[out]它只担心内存作为返回值。 简而言之,它可以帮助代码更有效地运行,因此使用它们总是一个好主意(无论是连接点还是方法参数)。

它还可以防止运行时错误。例如,将一个值设置为未标记为[out]的param的被调用函数将不会获得它期望返回给调用函数的值,因为运行时不会知道将其编组回来。