Здравствуйте aik, Вы писали:
[skipped]
aik>Потому что, если ты занялся COM'ом, операторы new и (особенно!!!) delete — забудь. Нельзя делать delete на интерфейс (это просто ошибка, free ругнется на порченую память в большинстве случаев), да и не COM это уже будет. Также нельзя полагаться на значения, возвращаемые AddRef'ом и Release'ом, хочется — откажись от COM.
Какой еще free. У меня ничего никогда не ругается. И при чем здесь AddRef и Release()?
aik>Автор сделал скобки для того, чтобы по выходу из QueryInterface (а на ее месте могло быть что угодно) указатель был все еще валидным, мало что там функция захочет сделать, может, она подчищает за собой лишние ссылки и может лишним релизом грохнуть объект.
QI ни при каких обстоятельствах не вызовет Release()! Это основы СОМ!
aik>И кто думает, что QI выдаст плохой HRESULT, если объект уже удален — наивны. Вернет мусор или шлепнется с исключением.
Так вернет мусор или шлепнется с исключением? Ты определись! Если p уже указывает на мусор она вообще не вызовется! Вообщем, братан, читай книжки,
статьиАвтор(ы): Том Армстронг
В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.
и все будет пучком!