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

我在一个IUnknown来源的COM接口中有一个函数:

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

合同是实现应该检查缓冲区是否足够大以存储正在检索的string。 如果缓冲区足够大,string被复制并返回S_OK ,否则函数将返回一个错误指示。

但是我找不到合适的HRESULT值。 E_UNEXPECTED似乎非常愚蠢和无益。 我发现最接近的是DISP_E_BUFFERTOOSMALL但看起来像是仅用于IDispatch衍生的接口。

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

Solutions Collecting From Web of "当提供的缓冲区太小时,哪个HRESULT返回?"

你不能返回DISP_E_ *错误,你没有实现IDispatch。 E_INVALIDARG在这里是正确的,它甚至是毫不含糊的,不经常发生。 总是实现ISupportErrorInfo来生成好的错误消息,ATL使Error()方法变得微不足道。

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

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

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

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

如果你仍然可以做些什么,你应该考虑改变接口来返回一个BSTR而不是WCHAR* 。 它简化了很多东西。

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

信贷应该去@tenfour提出这个建议。 既然你不能发表和转发你的upvotes给别人,我发布为社区维基