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

COM-作为输入传递固定大小的数组(设计时已知大小),com,Com,我有一个com方法,我想在其中传递一周中7天的信息,以无符号长编码(表示一周中一天中“选定”的小时数) 这是实现这一点的一种方法,但对于COM客户端来说,它必须传递一个包含7个元素的数组并不明显,其中每个元素都是一天(更不用说排序可以是第一天的周一或周日,并且在接口中不显式) 有没有办法使输入数组的大小显式 我知道每天将其分为7种不同的方法可能更好,而且如果没有得到预期的数字,您应该添加一个大小参数并返回一个错误E_INVALIDARG应发送来电者查找文档 如果您正在编组,我怀疑您可以为或使

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

这是实现这一点的一种方法,但对于COM客户端来说,它必须传递一个包含7个元素的数组并不明显,其中每个元素都是一天(更不用说排序可以是第一天的周一或周日,并且在接口中不显式)

  • 有没有办法使输入数组的大小显式

我知道每天将其分为7种不同的方法可能更好,而且如果没有得到预期的数字,您应该添加一个大小参数并返回一个错误
E_INVALIDARG
应发送来电者查找文档


如果您正在编组,我怀疑您可以为或使用常量,但这里的情况并非如此。

您应该添加一个大小参数,如果没有获得所需的数字,则返回一个错误
E_INVALIDARG
应发送来电者查找文档


如果您正在编组,我怀疑您可以为或使用常量,但这里的情况并非如此。

对于调度兼容的自动化客户端,您必须使用SAFEARRAY,这是不可能的。SAFEARRAY知道自己的大小,因此可以安全地编组

如果出现错误,您最好返回E_INVALIDARG并设置一个描述问题的IErrorInfo。此外,请在您的文档中提及


对于IUnknown绑定,您可以使用带有
size\u的原始指针作为intreface声明,但我怀疑它是否能够改进

编辑

我知道每天把它分成7种不同的方法可能会更好

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

其他客户机试图更改单个值时存在竞争条件,您可能需要对此进行准备


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

对于interface,IMO来说,这会更明显一些,但是如果对象可以是远程的,那么总是欢迎使用一个服务器往返来同时设置所有工作日的方法


编辑偶建议对数组使用固定大小,如下所示:

// MIDL:
HRESULT SetWeekdayNames([in] BSTR valNames[8]);
与尺寸不同,_是变量:

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

各自的C++声明可能是

HRESULT SetWeekdayNames(BSTR * valNames);

在这两种情况下。

对于调度兼容的自动化客户端,您必须使用SAFEARRAY,这是不可能的。SAFEARRAY知道自己的大小,因此可以安全地编组

如果出现错误,您最好返回E_INVALIDARG并设置一个描述问题的IErrorInfo。此外,请在您的文档中提及


对于IUnknown绑定,您可以使用带有
size\u的原始指针作为intreface声明,但我怀疑它是否能够改进

编辑

我知道每天把它分成7种不同的方法可能会更好

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

其他客户机试图更改单个值时存在竞争条件,您可能需要对此进行准备


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

对于interface,IMO来说,这会更明显一些,但是如果对象可以是远程的,那么总是欢迎使用一个服务器往返来同时设置所有工作日的方法


编辑偶建议对数组使用固定大小,如下所示:

// MIDL:
HRESULT SetWeekdayNames([in] BSTR valNames[8]);
与尺寸不同,_是变量:

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

各自的C++声明可能是

HRESULT SetWeekdayNames(BSTR * valNames);

在这两种情况下。

否,这些属性仅用于封送处理,在类型库中不可用,并且仅应用于非自动化兼容的类型。E_INVALIDARG是正确的方法。不,这些属性仅用于封送,在类型库中不可用,并且仅应用于不兼容自动化的类型。E_INVALIDARG是正确的方法。“对于IUnknown绑定,您可以使用带有大小声明的原始指针来进行intreface,但我怀疑它是否能够改进事情。”我同意您关于E_INVALIDARG解决方案的说法。但你们能写下“size_is”界面的外观吗?根据要求添加。看起来您可以直接在声明中使用一个看起来非常好的常量(我不知道这种可能性)([in]BSTR valNames[8])。若BSTR数组不是8(我猜是错误的参数或类似的参数),那个么它将在运行时被检测到“那个将在运行时被检测到”-不很抱歉MIDL注释用于封送拆收器(单元外/进程外调用),单元内调用(最常见的情况)忽略此信息。此外,
BSTR*
没有任何指示有多少BSTR,因此即使是封送员也不知道将8与什么进行比较。--接口只是说“我希望这里有8个字符串。确保它们确实有那么多,不多也不少”。因此,基本上只是向COM客户端指示它应该在那里传递8个数组值。如果我在运行时检测到它没有传递正确的参数,我必须返回E_error_ARG(在这些行周围)“对于IUnknown绑定,您可以使用带有大小声明的原始指针来进行intreface,但我怀疑它是否能改进事情。”我同意您关于E_INVALIDARG解决方案的说法。但是你能写下“尺寸”是多少吗