2

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

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
4

2 回答 2

1

参数属性魔法在 MSDN 上解释如下:

[in] 属性有一个相反的属性,[out],它表示参数将从被调用过程返回给调用过程。[in] 和 [out] 属性称为方向参数属性,因为它们指定传递参数的方向。参数可以定义为 [in]、[out] 或 [in, out]。

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

当未指定方向参数属性时,默认情况下将 [in] 属性应用于参数。

简要说明如下:

  • 参数是in,outin/out, 无方向参数没有意义,所以如果你省略属性,[in]仍然适用;您不必输入,[in]但为了清楚起见,这样做是个好主意
  • 这些参数定义了当涉及到编组时参数值传输的方向,以及当调用假定在调用者/被调用者方式上进行某些传输时的传输方向
于 2013-10-08T20:12:06.880 回答
0

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

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

于 2013-10-08T18:38:00.390 回答