Нужно ли вызывающей стороне освобождать IShellBrowser *, полученный посредством недокументированного сообщения WM_GETISHELLBROWSER (WM_USER + 7)? - PullRequest
0 голосов
/ 15 декабря 2009

Некоторые отметили, что существует недокументированное сообщение, которое извлекает указатель интерфейса IShellBrowser из общего диалога HWND для диалогов открытия и сохранения файла.

Но есть противоречивая информация (или нет информации) о том, является ли этот указатель AddRef'd или это просто возвращенный необработанный адрес, и не нужно ли вызывать Release () для него?

1 Ответ

3 голосов
/ 15 декабря 2009

Нет. Может оказаться полезной следующая ссылка: Правила объектной модели компонентов .

Выдержка:

Правила подсчета ссылок

Правило 1: AddRef должен быть вызван для каждая новая копия интерфейса указатель, а Release вызывается для каждого уничтожение указателя интерфейса, кроме случаев, когда последующие правила явно разрешить иное.

Следующие правила вызывают общие исключения из правила 1.

  • Правило 1a: Входные параметры для функций. Вызывающая сторона должна добавить фактический параметр AddRef, поскольку он будет выпущен вызывающим объектом, когда выходное значение будет сохранено поверх него.
  • Правило 1b: извлечение глобальной переменной. Локальная копия указателя интерфейса, полученная из существующей копии указателя в глобальной переменной, должна быть независимо подсчитана, поскольку вызываемые функции могут уничтожить копию в глобальной, пока локальная копия еще жива.
  • Правило 1c: Новые указатели синтезируются из "воздуха". Функция, которая синтезирует указатель интерфейса, используя специальные внутренние знания, а не получает его из какого-либо другого источника, должна выполнить начальный AddRef для вновь синтезированного указателя. Важными примерами таких подпрограмм являются подпрограммы создания экземпляров, реализации IUnknown :: QueryInterface и т. Д.
  • Правило 1d: Возвращение копии внутренне сохраненного указателя. После того, как указатель был возвращен, вызываемый не имеет представления о том, как его время жизни совпадает с временем жизни внутренне сохраненной копии указателя. Таким образом, вызываемый должен вызвать AddRef для копии указателя, прежде чем вернуть его.

Правило 2: Специальные знания со стороны части кода отношения начал и окончания жизни двух или больше копий указателя интерфейса может позволить парам AddRef / Release быть опущено.

  • С точки зрения COM-клиента подсчет ссылок всегда является концепцией для каждого интерфейса. Клиенты никогда не должны предполагать, что объект использует один и тот же счетчик ссылок для всех интерфейсов.
  • На возвращаемые значения AddRef и Release не следует полагаться, и их следует использовать только для целей отладки.
  • стабильность указателя; подробности см. в файле справки OLE в разделе «Правила подсчета ссылок», подраздел «Стабилизация этого указателя и сохранение его действительным».

см. Отличный «Управляющий объект» "Время жизни в OLE" техническая статья Дуглас Ходжес, и Глава 3 Inside OLE, 2-е издание, автор Kraig Брокшмидт (Библиотека MSDN, Книги) для больше информации о подсчет ссылок. * 1 034 *

...