Сервер COM должен назвать SysFreeString () для параметр?

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

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

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

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

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

Та статья является правильной? Сделайте я должен освободить переданный BSTR [out] параметр прежде, чем присвоить новый?

6
задан sharptooth 28 April 2010 в 11:34
поделиться

2 ответа

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

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

4
ответ дан 16 December 2019 в 21:36
поделиться

В документации указано, что указатели OUT никогда не должны освобождаться вызываемым пользователем, поэтому, IMHO, вам лучше соблюдать спецификацию .

Лучшее

4
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: