COM - 作为输入传递固定大小的数组(在设计时已知大小)

时间:2011-09-12 14:18:31

标签: com

我有一个com方法,我希望传递一周中7天的信息,这些信息以无符号长整数编码(表示一周中“选定”的小时数)

[id(5)]          HRESULT GetSchedule([out, retval] SAFEARRAY(unsigned long)* days);
[id(6)]          HRESULT SetSchedule([in] SAFEARRAY(unsigned long) days);

这是实现此目的的一种方法,但对于COM客户端来说,它必须传递7个元素的数组,其中每个元素都是一天(更不用说订购可以是周一或周日的第一天) ,并且在界面中不明确)。

  • 有没有办法让输入数组的大小显式化?

我知道每天用7种不同的方法分割它仍然会更好,也是

2 个答案:

答案 0 :(得分:1)

对于与Dispatch兼容的自动化客户端,您必须使用SAFEARRAY,这是不可能的。 SAFEARRAY知道自己的尺寸,可以安全地编组。

如果出现错误,您可以做的最好的事情是返回E_INVALIDARG并设置描述问题的IErrorInfo。另外,请在您的文档中提及。

对于IUnknown-Binding,您可以使用带有size_is声明的原始指针,但我怀疑owuld会改进。

修改

  

我知道每天用7种不同的方法分割它仍然会更好,也是

不一定,在某些情况下打电话会很痛苦。

与其他客户尝试更改单个值存在竞争条件,您可能需要为此做出规定。


您还可以将其设置为索引属性(即采用附加“工作日”参数的propget / propput方法)。同样,您必须验证工作日参数是否在有效范围内。

这作为接口,IMO会更加明显,但如果对象可能是远程的,则始终欢迎使用单个服务器往返一次设置所有工作日的方法。


编辑 MSDN page甚至建议对数组使用固定大小,如下所示:

// MIDL:
HRESULT SetWeekdayNames([in] BSTR valNames[8]);

而不是size_is变体:

HRESULT SetWeekdayNames([in, size_is(8)] BSTR * valNames);

相应的C ++声明可能是

HRESULT SetWeekdayNames(BSTR * valNames);

两种情况。

答案 1 :(得分:0)

如果没有得到您期望的数字,您应该添加一个尺寸参数并返回错误。 E_INVALIDARG应该向调用者发送文档。

如果你是编组,我怀疑你可以使用size_islength_is的常量,但这不是这里的情况。