2009-12-15 2 views
0

Несколько указали, что существует недокументированное сообщение, которое извлекает указатель интерфейса IShellBrowser из общего диалогового окна HWND для открытого файла &.Должен ли вызывающий абонент освобождать IShellBrowser *, полученный через недокументированное сообщение WM_GETISHELLBROWSER (WM_USER + 7)?

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

ответ

3

№ Вам может понадобиться следующая ссылка полезная: The Rules of the Component Object Model.

Выдержка:

Референс-счетных Правила

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

Следующие правила взывать общие nonexceptions Правилу 1.

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

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

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

См отлично "Управление объекта Сроки службы в OLE" технической статье Дуглас Ходж, и в главе 3 Inside OLE, 2-е издание, по Kraig Brockschmidt (MSDN Library, книги) для дополнительной информации на подсчета ссылок

+1

к сожалению. - Я чувствую себя немного толстая Но ваше первое утверждение: «нет», как ни в мне не нужно, чтобы освободить() возвращаемый IShellBrowser * -. все же документация для правила 1 (и, особенно, его исключений), как представляется, указывает на то, что указатель, который я передал, будет h ave был AddRef'd от моего имени (так же, как это сделал QueryInterface). – Mordachai

+0

Вы можете вызвать AddRef()/Release() вручную на этом объекте, если хотите, как указано в правиле 1c («хочу» я имею в виду, что время жизни объекта управляется диспетчером окон). Но вам не нужно вызывать только Release(). – arul

+0

Так вы понимаете, что это особый случай 1c (я вижу, как это имеет смысл, основываясь на названии 1c). И если это так, 1c говорит в основном, что он не является ни выходным, ни in-in, ни inout-параметром, а синтезированным, и как таковой должен быть как AddRef'd, так и Releaseed вызывающим (или, как это, очевидно, имеет место здесь, и если я не попытался удержать указатель дольше, чем время жизни текущего IShellBrowser, что не произойдет в моем пользовательском обработчике OPENFILEDIALOG). – Mordachai

Смежные вопросы