Я уже давно получаю вашу подписку. Она мне очень нравится. Но у меня всё время возникает вопрос когда я читаю очередной номер подписки. Почему почти все выпуски так или иначе посвещены MFC? Даже если тема к примеру ODBC, то примеры всё равно на MFC? Я не имею ничего против MFC, но сам последний раз писал на ней уже очень давно потому-что MFC больше всё-же desktop-UI-ориентированная. То чем я занимаюсь и надеюсь не только я. Написанием COM, COM+ компонентов с UI обычно на ASP. Компоненты я пишу на ATL с STL, с доступом к базам данных через OLE DB/ADO. По ATL/STL/COM/COM+/OLE DB/ADO довольно мало материала в подписке. Почему? Неужели подавляющее большинство подписчиков пишет только на MFC?
Q. Как в Win9x и WinNT заблокировать клавиши WIN, Alt+Tab, Ctrl+Esc etc.?
А на сегодня это все… До скорого!
Программирование на Visual C++
Выпуск №29 от 24 декабря 2000 г.
Здравствуйте, уважаемые подписчики!
Рад снова приветствовать вас на страницах рассылки. В этом выпуске вас ожидает вторая часть статьи "Введение в COM" и, конечно же, ответы на вопрос из предыдущего выпуска и кое-что еще.
СТАТЬЯ
Введение в COM
Автор: michael dunn
Перевод: Илья Простакишин
Источник: The Code Project
Каждый COM-интерфейс наследуется от интерфейса IUnknown. Имя выбрано не совсем удачно, поскольку этот интерфейс не является "неизвестным" (unknown). Это имя всего лишь означает, что если вы имеете указатель на интерфейс COM-объекта IUnknown, то вы не можете знать, какой объект им владеет (реализует), поскольку интерфейс IUnknown есть в
IUnknown включает три метода:
1. AddRef – заставляет COM-объект увеличивать (инкрементировать) свой счетчик обращений. Вы должны использовать этот метод, если была сделана копия указателя на интерфейс и нужно обеспечить возможность использования двух указателей – копии и оригинала. Мы не будем использовать метод AddRef в этой статье, т.к. для рассматриваемых здесь задач он не нужен.
2. Release – сообщает COM-объекту о необходимости уменьшения (декремента) счетчика обращений. Смотрите предыдущий пример, чтобы понять, как нужно использовать Release.
3. QueryInterface – запрашивает указатель на интерфейс COM-объекта. Используется если CO-класс содержит не один, а несколько интерфейсов.
Вы уже видели пример использования Release, но как же действует QueryInterface? Когда вы создаете COM-объект с помощью CoCreateInstance, вы получаете указатель на интерфейс. Если COM-объект включает более одного интерфейса (не считая IUnknown), вы должны использовать метод QueryInterface для получения дополнительных указателей на интерфейсы, которые вам нужны. Посмотрим на прототип QueryInterface:
HRESULT IUnknown::QueryInterface(REFIID iid, void** ppv);
Значения параметров:
iid | IID интерфейса, который вам нужен. |
ppv | Адрес указателя на интерфейс. QueryInterface возвращает указатель на интерфейс через этот параметр, если не произошло никаких ошибок. |
Продолжим наш пример с ярлыком. CO-класс для создания ярлыков включает интерфейсы IShellLink и IPersistFile. Если у вас уже есть указатель на IShellLink – pISL, то вы можете запросить интерфейс IPersistFile у COM-объекта с помощью следующего кода:
HRESULT hr;
IPersistFile* pIPF;
hr = pISL->QueryInterface(IID_IPersistFile, (void**)&pIPF);