为COM接口参数传递NULL是否有效?

时间:2015-10-09 09:00:54

标签: com

如果我有一个期望BSTR和SAFEARRAY参数的COM接口方法,但这些是可选的,实现这个的正确方法是什么?我可以传递NULL还是需要传递空字符串和零长度数组?或者我会更好地传递可以是VT_EMPTY VT_BSTR / VT_ARRAY的VARIANT?

e.g。

Login([in]BSTR Name, [in]BSTR Password /*optional*/);
SendEmail([in]SAFEARRAY *To, [in]SAFEARRAY *Cc /*optional*/);

在这些示例中,Password应该作为NULL或“”传递吗?并且Cc应该作为NULL传递,还是我需要创建一个0长度的SAFEARRAY,或者传递一个VT_EMPTY类型的VARIANT ......哪些是有效/合理的选项?

1 个答案:

答案 0 :(得分:2)

嗯,这些参数确实不太正确 - 如果你尝试将除VARIANT之外的任何东西设为“可选”的话,MIDL编译器应该发出警告甚至是错误。

正确的方法是定义默认值(“defaultvalue”)。对于BSTR,您希望将默认值设为L“”而不是0(NULL)。如果你将BSTR的默认值设置为0,那么你将遇到问题 - 我认为在某些.NET互操作中。

对于SAFEARRAY,将“defaultvalue”设为NULL应该是安全的。

当然,这个建议来自于设计界面应该如何。您可能处于某人已经设计并实现了界面的情况。在这种情况下,你将受其实施的支配。对于BSTR参数,我会尝试传入空字符串(L“”),对于SAFEARRAY,我会尝试传入NULL。

如果您要将其定义为“可选”,请将其设为变体。在这种情况下,正确的参数是VT_EMPTY。