当提供的缓冲区太小时返回哪个HRESULT?

时间:2011-02-18 10:04:11

标签: windows visual-c++ com error-handling

我在IUnknown派生的COM接口中有一个函数:

HRESULT GetPassword( [in] long bufferLength, [out] WCHAR* buffer );

和契约是实现应该检查缓冲区是否足够大以存储被检索的字符串。如果缓冲区足够大,则复制字符串并返回S_OK,否则函数将返回错误指示。

但是我找不到合适的HRESULT值。 E_UNEXPECTED似乎非常愚蠢和无益。我找到的最接近的是DISP_E_BUFFERTOOSMALL,但看起来只适用于IDispatch - 派生接口。

如果提供的缓冲区太小,我应该返回哪个HRESULT

4 个答案:

答案 0 :(得分:4)

您无法返回DISP_E_ *错误,您没有实现IDispatch。 E_INVALIDARG在这里是正确的,它甚至是明确的,不会经常发生。始终实现ISupportErrorInfo以生成良好的错误消息,ATL使用Error()方法使其变得微不足道。

答案 1 :(得分:1)

听起来很蹩脚,从技术上讲,E_INVALIDARG可能是你最好的选择。没有那么多标准HRESULT更具体的参数。还有E_POINTER但它可能会更令人困惑。

我会考虑使用DISP_E_BUFFERTOOSMALL。这对于调用者来说是直观的,唯一的风险是他们不能识别它,因为它不在标准的通用HRESULT值集中。我认为这是一个相当小的风险,因为一个非常小的问题:)

答案 2 :(得分:1)

您不应该返回错误。你应该成功,用尽可能多的东西填充缓冲区,并通过另一个参数返回缓冲区需要的大小。

如果你不这样做,调用者如何发现分配的缓冲区有多大?你不是真的希望他们反复调用,逐渐增大缓冲区,直到它们达到足够的值?我不想使用这样的界面!

答案 3 :(得分:1)

如果你仍然可以做些什么,你应该考虑更改界面以返回BSTR而不是WCHAR*。它简化了很多事情。

有时你可以,有时你不能。

应该去@tenfour建议这个。由于您无法将您的upvotes发布和转发给其他人,我将发布为社区wiki