Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
COM中的NULL in/out参数_Com - Fatal编程技术网

COM中的NULL in/out参数

COM中的NULL in/out参数,com,Com,My COM对象有一个方法,在IDL中定义为: HRESULT _stdcall my_method( [in] long value, [in, out] IAnotherObject **result ); 是否允许调用方这样调用此方法: ptr->my_method(1234, NULL); 或者调用方这样做是否违反了COM规范 换句话说,实现此函数的代码是否应该检查result!=继续之前为空;如果是这样,COM规范是否要求我返回E_INVALIDARG或E_指针或其他东西;或

My COM对象有一个方法,在IDL中定义为:

HRESULT _stdcall my_method( [in] long value, [in, out] IAnotherObject **result );
是否允许调用方这样调用此方法:

ptr->my_method(1234, NULL);
或者调用方这样做是否违反了COM规范

换句话说,实现此函数的代码是否应该检查
result!=继续之前为空
;如果是这样,COM规范是否要求我返回E_INVALIDARG或E_指针或其他东西;或者,如果我的函数继续运行并返回
0
,而不分配其他对象,这是否可以接受

我的目标是与自动化兼容;它使用标准编组

注意:从我的原文开始编辑问题。在发布这个问题后,我发现
可选
,以及
[in,out]
参数,其中
结果!=空的
但是
*结果==NULL

说:

in-out参数最初由调用者分配,然后在必要时由被调用者释放和重新分配。与out参数一样,调用方负责释放最终返回的值。必须使用标准COM内存分配器

因此,传递
NULL
是一种违规行为。即使在Microsoft自己的接口中,您也可以看到一些违反COM规则的情况,例如,一些
[out]
参数接受
NULL
,但这是因为它们具有远程接口方法(请参阅和),这些方法很可能在跨单元时分配所需的内存,或者执行自定义封送处理


编辑:进一步回答您的问题


我建议您检查
NULL
[out]
(或
[in,out]
)参数,找到参数后返回
E_指针。这将允许您尽早捕获/检测最常见的错误,而不是引发访问冲突。

是的,您应该检查参数的有效性

如果客户机与服务器在进程中(以及相同的单元等),则没有任何东西(没有代理,没有存根)可以保护您的代码不被NULL调用

所以你是唯一一个执行任何COM规则的人,不管这是否被视为“违反”


PS:为自动化客户端定义in+out(不使用变体)似乎有点不寻常。我不确定所有的自动化客户端都可以使用这个(VBScript?

只是澄清一下:调用者必须确保
result
指向
IAnotherObject*
的有效存储。对于
[in,out]
,存储的指针可以是
NULL
,也可以是有效指针。被调用方必须在存储器中放入有效指针(通常与传入的指针相同)。是的,
IAnotherObject**
不能为
NULL
,因为它是
[ref]
指针,但其
IAnotherObject*
值可能是
NULL
,无论是由调用方提供的还是被调用方设置的,因为它是一个
[唯一的]
指针。请参阅:。此外,接口指针总是
[unique]
,如果您尝试应用其他指针类型,MIDL将发出警告。