Должен ли COM-сервер вызывать SysFreeString () для параметра [out]? - PullRequest
6 голосов
/ 28 апреля 2010

У нас есть следующий интерфейс:

[object, uuid("uuidhere"), dual ]
interface IInterface : IDispatch
{
    [id(1), propget] HRESULT CoolProperty( [out, retval] BSTR* result );
}

Теперь есть небольшая проблема. С одной стороны, параметр «вне», и поэтому любое значение может быть передано в качестве ввода, параметр станет действительным только после успешного возврата. С другой стороны, есть эта статья MSDN , на которую ссылаются многие страницы, на которых в основном говорится (последний абзац), что если любая функция передана BSTR*, она должна освободить строку перед назначением новой строки .

Это ужасно. Если эта статья верна, это означает, что все вызывающие абоненты должны обязательно передать действительные BSTR (возможно, нулевые BSTR), в противном случае переданный BSTR может быть пропущен. Если вызывающий передал случайное значение и вызываемый пытается вызвать SysFreeString(), это приводит к неопределенному поведению, поэтому соглашение является критическим.

Тогда какой смысл в атрибуте [out]? Какая разница будет между [in, out] и [out] в этой ситуации?

Эта статья права? Нужно ли освобождать переданный параметр BSTR [out] перед назначением нового?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2010

Документация гласит, что указатель OUT никогда не должен освобождаться вызываемым пользователем, поэтому, ИМХО, вам лучше придерживаться спецификации.

Лучший * * 1005

4 голосов
/ 28 апреля 2010

Вы должны ожидать, что клиент будет следовать контракту, соблюдать атрибут [out] и не передавать инициализированный BSTR, который должен быть освобожден. Двойная проверка и ожидание NULL не хорошо, контракт не требует, чтобы клиент передавал указатель на инициализированную ячейку памяти. Обычно вы получите указатель на переменную BSTR, размещенную в кадре стека. Скорее всего, он содержит случайный мусор, только защитник может установить его в NULL.

В противном случае он несовместим с OLE-автоматизацией. Только [out, retval] и [in, out] действительны в этом случае, без сомнения, чтобы избежать этой конкретной ловушки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...