【发布时间】:2013-10-15 20:09:54
【问题描述】:
我有一个名为 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
【问题讨论】:
-
他们仍然应该被归因,不清楚你是如何使用向导的。不是那么重要,[in] 是默认值,并且始终应该用于连接点,因为您不能指望客户端代码实际订阅事件。
-
[in]和/或[out]必须在那里,否则编组不知道通过哪种方式在各方之间传递价值。 -
@RomanR。您会感到惊讶,但在没有为连接点方法参数设置任何属性的情况下,封送处理工作正常。我不知道它是如何工作的,即使对于更“复杂”的对象,例如 SAFEARRAY 编组到托管代码(在我的情况下是 C#)也可以正常工作!
-
@HansPassant。我按照教程使用向导创建连接点方法。根据那个教程,他们没有勾选任何方法参数属性(int/out/retval),只是选择了类型并输入了一个名称。这就是“TotalMarks”“a_lTotalMarks”最终没有任何属性的方式。但正如上面提到的,它工作得很好。这就是为什么我很好奇它为什么工作......
标签: c++ visual-c++ com atl