在COM中使用成功HRESULT

时间:2014-06-17 12:03:53

标签: com

我在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]参数的新函数来获取使用哪个按钮?

1 个答案:

答案 0 :(得分:2)

大多数语言运行时都会将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 类型来命名合法按钮并返回值,从而进一步改进它。