【问题标题】:Using success HRESULTs in COM在 COM 中使用成功的 HRESULT
【发布时间】:2014-06-17 20:19:15
【问题描述】:

我在 COM 接口中有一些函数通过 HRESULT 返回不同的成功值,但使用定义为“成功”的空间(即SUCCEEDED(hr) 非零)。

例如

HRESULT MyMessageBox( BSTR title /*[in]*/, BSTR text /*[in]*/, long buttons /*[in]*/ );

显示类似于 MessageBox 的对话框的函数;它返回用户用来关闭对话框的按钮的指示符。 (我为此定义了一个枚举,其值位于 HRESULT 空间内,为用户定义的代码保留)。

这在 C++ 客户端中很好;但是,当 VB 是客户端或 Java 包装器(例如 JACOB)时,它似乎会拦截 HRESULT,并且客户端无法判断发生了哪些成功的代码。

让 HRESULT 指示除0 或异常之外的任何内容实际上是一种糟糕的设计吗?我应该改为创建具有[out] 参数的新函数来获取使用哪个按钮?

【问题讨论】:

    标签: com


    【解决方案1】:

    大多数语言运行时都会将 HRESULT 映射到异常,这使得编写 COM 代码更加容易。是的,他们会忽略积极的价值观。他们可能对此有一个转义,在 .NET 中,[PreserveSig] 属性抑制异常映射并将 HRESULT 返回值公开为 int

    但这很痛苦,也没有必要。它们还会将您装饰为 [out, retval] 的参数映射到函数返回值。这是您在此处寻找的内容:

    HRESULT MyMessageBox([in] BSTR title, [in] BSTR text, [in] long buttons,
                         [out,retval] long* result);
    

    现在客户端程序员可以这样写:

    int result = yadayada.MyMessageBox("title", "text", 0);
    

    让您有机会将 HRESULT 仅用于“函数失败”返回值,否则为 S_OK。您可以通过使用 enum 类型来命名合法按钮并返回值来进一步改进它。

    【讨论】:

    • 听起来不错。你能推荐一本书来解释这样的事情,而且可读性强吗? (当我对 COM 知之甚少时,我就做出了所有的设计决定,只要我能在网上找到任何东西;我的 COM 知识有很多基本的漏洞)。
    • 我不推荐不知道谁会读的书。我读过的大部分都已经绝版了。访问 amazon.com,阅读评论。
    • 我非常不信任亚马逊评论!出版商很容易将自己的“评论”放在首位
    • 我无法真正帮助您解决信任问题。不管评论如何,一本书总比没有好。一个明显的解决方案是获取所有这些。
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2021-11-11
    • 2015-10-02
    • 2011-02-13
    • 2012-02-23
    • 2020-06-05
    • 2015-07-30
    相关资源
    最近更新 更多