【发布时间】:2015-10-09 22:49:55
【问题描述】:
如果我有一个需要 BSTR 和 SAFEARRAY 参数的 COM 接口方法,但这些是可选的,那么实现它的正确方法是什么?我可以传递 NULL 还是需要传递空字符串和零长度数组?或者我会更好地传递可以是 VT_EMPTY 或 VT_BSTR / VT_ARRAY 的 VARIANT?
例如
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...哪些是有效/明智的选项?
【问题讨论】:
-
呃,“实现这个”?当然听起来你正在为调用它而烦恼。请准确。并发布方法的声明,这样我们就不必猜测了。
-
我只是问你是否可以传递 NULL,或者必须传递“空对象”。这会影响 COM 实现知道要检查什么,对于可选参数。
-
NULL是BSTR的有效值,无论它是否被视为可选参数。我认为安全数组不是这种情况,那里应该有一个有效的指针。您可以将NULL传递给数组和其他指针,如果实现直接接收调用,则它会工作,无需编组。然而,Marshaler 可能会在意外的NULLs 上失败。defaultvalue和optional仅适用于VARIANTs。
标签: com