我有和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
答案 0 :(得分:1)
参数属性magic是explained on MSDN here:
[in]属性有一个converse属性,[out],表示 一个参数将从被调用的过程返回到 呼叫程序。 [in]和[out]属性称为 方向参数属性,因为它们指定了方向 传递哪些参数。参数可以定义为[in], [out],或[in,out]。
[in]属性标识由编组封送的参数 客户端存根,用于传输到服务器。
缺省情况下,[in]属性默认应用于参数 指定了方向参数属性。
以下简要说明如下:
in
,out
和in/out
,无方向参数没有意义,因此如果省略属性,[in]
仍然适用;你不必放[in]
,但为了清晰起见,这是一个好主意答案 1 :(得分:0)
COM中的属性是COM运行时关于它可以进行优化的提示。例如,如果param被标记为[in]
,则运行时知道它不必为返回值分配任何内存。如果[out]
它只担心内存作为返回值。
简而言之,它可以帮助代码更有效地运行,因此使用它们总是一个好主意(无论是连接点还是方法参数)。
它还可以防止运行时错误。例如,将一个值设置为未标记为[out]
的param的被调用函数将不会获得它期望返回给调用函数的值,因为运行时不会知道将其编组回来。