Каковы возможные возвращаемые значения CComBSTR :: AssignBSTR ()? - PullRequest
0 голосов
/ 18 января 2012

В статье MSDN просто сказано:

Возвращаемое значение

S_OK в случае успеха или любое стандартное значение ошибки HRESULT.

Однако, мое предположениеявляется то, что E_OUTOFMEMORY - единственно возможное возвращение ошибки, поскольку NULL является допустимым вводом, а неверное расположение в памяти просто вызовет нарушение прав доступа (надеюсь).

Итак.Есть ли другие возможные HRESULTS из этого метода?

Примечание: следующие все возвращают S_OK:

CComBSTR bstr;
bstr.AssignBSTR(NULL);
bstr.AssignBSTR(SysAllocString(L""));   //clearly a leak, abbreviated example...
bstr.AssignBSTR(SysAllocString(L"HI"));

Итог: Является ли следующая хорошая практика (и почему я часто вижу другие реализации?):

class foo {
public:
  STDMETHOD(put_Bar)(BSTR p);
private:
  CComBSTR m_bstrBar
};

STDMETHODIMP foo::put_Bar( BSTR p)
{
    return m_bstrBar.AssignBSTR(p);
}

1 Ответ

2 голосов
/ 18 января 2012

Да, E_OUTOFMEMORY - это именно в этом особом случае.Вы можете увидеть исходный код в vc / atlmfc / include / atlcomcli.h

В остальном это похоже на запрос спецификаций исключений.Не работает, COM-методы могут вернуть любой код ошибки.Тоже странные, когда вызов маршалируется вне процесса или по сети.

...