У нас есть следующий интерфейс:
[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]
перед назначением нового?