我在IUnknown
派生的COM接口中有一个函数:
HRESULT GetPassword( [in] long bufferLength, [out] WCHAR* buffer );
和契约是实现应该检查缓冲区是否足够大以存储被检索的字符串。如果缓冲区足够大,则复制字符串并返回S_OK
,否则函数将返回错误指示。
但是我找不到合适的HRESULT
值。 E_UNEXPECTED
似乎非常愚蠢和无益。我找到的最接近的是DISP_E_BUFFERTOOSMALL
,但看起来只适用于IDispatch
- 派生接口。
如果提供的缓冲区太小,我应该返回哪个HRESULT
?
答案 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 。