在COM中使用成功HRESULT

在COM中使用成功HRESULT,com,Com,我在COM接口中有一些函数,它们通过HRESULT返回不同的成功值,但使用定义为“成功”的空格(即succeed(hr)为非零) 比如说 HRESULT MyMessageBox( BSTR title /*[in]*/, BSTR text /*[in]*/, long buttons /*[in]*/ ); 显示类似于消息框的对话框的函数;它返回用户用来关闭对话框的按钮的指示器。(我为此定义了一个枚举,其值位于为用户定义代码保留的HRESULT空间内) 这在C++客户端中是很好的;但是,当

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

比如说

HRESULT MyMessageBox( BSTR title /*[in]*/, BSTR text /*[in]*/, long buttons /*[in]*/ );
显示类似于消息框的对话框的函数;它返回用户用来关闭对话框的按钮的指示器。(我为此定义了一个枚举,其值位于为用户定义代码保留的HRESULT空间内)

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


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

大多数语言运行时都会将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。您可以通过使用枚举类型来命名合法按钮并返回值来进一步改进它。

听起来不错。你能推荐一本书来解释这类事情,并且可读吗?(当我对COM知之甚少时,我就做出了所有的设计决定,这只是我在网络上能找到的东西;我的COM知识中有很多基本的漏洞)。我不推荐那些不知道谁会读的书。我读过的大多数书早已绝版。访问amazon.com,阅读评论。我对amazon评论非常不信任!出版商很容易安排他们自己的“评论”出现在topI上,我真的无法帮助你解决信任问题。一本书总比一本书好得多,不管书评如何。一个显而易见的解决办法是把它们都弄到手。