首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在IDL中标记参数[out,retval]是否比[out]更难处理错误?

在IDL中标记参数[out,retval]是否比[out]更难处理错误?
EN

Stack Overflow用户
提问于 2014-05-28 15:05:05
回答 2查看 196关注 0票数 1

这是对this question的跟进

在IDL中声明接口时,至少有两种方法可以从接口返回值:[out][out, retval]

当使用[out, retval]时,COM包装器使标记的参数成为返回值,不再从该方法返回HRESULT。问题是如何获得HRESULT来测试COM调用是否成功?而且,从COM服务器设计的角度来看,不返回COM方法调用时不返回HRESULT通常被认为是不好的做法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-28 15:22:19

有一个重要的区别,它取决于客户端代码中的语言运行时支持。它们中的许多,比如.NET或脚本语言,都会修改函数的签名,并使它看起来像是一个返回您用retval注释过的值的函数。并将隐藏HRESULT,在返回失败代码时自动触发异常。这可以使客户端代码看起来更加自然。

是的,您应该始终实现STDMETHOD,这样的语言运行时往往需要它。当客户端代码想要使用后期绑定时,以及当函数调用需要遍历单元边界(即从一个线程发送到另一个线程或跨越进程或机器边界)时,这也是一个困难的需求,这是您无法控制的。

票数 2
EN

Stack Overflow用户

发布于 2014-05-29 07:16:52

无论参数声明为[out]还是[out, retval]HRESULT都将返回给调用方。接下来发生的事情在很大程度上取决于实际调用方代码和COM之间的中间件。

如果它是.NET代码,那么HRESULT将由.NET生成的包装器检查,并引发一个异常,唯一的解决方案是捕获和解释异常,这可能会带来很大的痛苦,因为s will be translated to different exceptions

如果这是一些更老的东西,例如支持,那么您就有了选择。默认情况是,本机COM支持为每个带有[out, retval]参数的方法生成一个包装器,该方法现在返回该参数的类型,并在包装器内检查HRESULT,也许调用_com_issue_error()来抛出异常,并将原始的HRESULT传递到_com_issue_error()和可以从中检索它的异常对象。可以是为每个COM方法调用处理异常会给代码增加混乱,然后可以使用raw_interfaces_only#import指令,然后生成包装器--您将看到原来的接口。这取决于您选择什么-HRESULT的检查在包装内或没有包装。

无论如何,你将有办法知道有一个错误。使用[out, retval]绝不是一种糟糕的做法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23915307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档