- •Содержание
- •Управление памятью: хорошо, плохо и ужасно
- •Сегментированная память
- •Промежуточные решения
- •И, наконец, 32 бита
- •Выделение памяти
- •Библиотечные функции C
- •Фундаментальное выделение памяти в Windows 95
- •Перемещаемая память
- •Удаляемая память
- •Другие функции и флаги
- •Хорошо ли это?
- •Функции работы с "кучей"
- •Файловый ввод/вывод
- •Старый путь
- •Отличия Windows 95
- •Ввод/вывод с использованием файлов, проецируемых в память
- •Режимы многозадачности
- •Многозадачность в DOS
- •Невытесняющая многозадачность
- •Решения, использующие многопоточность
- •Многопоточная архитектура
- •Коллизии, возникающие при использовании потоков
- •Преимущества Windows
- •Новая программа! Усовершенствованная программа! Многопоточная!
- •Многопоточность в Windows 95
- •И снова случайные прямоугольники
- •Задание на конкурсе программистов
- •Решение с использованием многопоточности
- •О пользе использования функции Sleep
- •Синхронизация потоков
- •Критический раздел
- •Объект Mutex
- •Программа BIGJOB1
- •Объект Event
- •Локальная память потока
- •Печать, буферизация и функции печати
- •Контекст принтера
- •Формирование параметров для функции CreateDC
- •Измененная программа DEVCAPS
- •Вызов функции PrinterProperties
- •Проверка возможности работы с битовыми блоками (BitBlt)
- •Программа FORMFEED
- •Печать графики и текста
- •Каркас программы печати
- •Прерывание печати с помощью процедуры Abort
- •Реализация процедуры прерывания
- •Добавление диалогового окна печати
- •Добавление печати к программе POPPAD
- •Обработка кодов ошибок
- •Техника разбиения на полосы
- •Разбиение на полосы
- •Реализация разбиения страницы на полосы
- •Принтер и шрифты
- •Глава 16 Буфер обмена
- •Простое использование буфера обмена
- •Стандартные форматы данных буфера обмена
- •Передача текста в буфер обмена
- •Получение текста из буфера обмена
- •Открытие и закрытие буфера обмена
- •Использование буфера обмена с битовыми образами
- •Метафайл и картина метафайла
- •Более сложное использование буфера обмена
- •Использование нескольких элементов данных
- •Отложенное исполнение
- •Нестандартные форматы данных
- •Соответствующая программа просмотра буфера обмена
- •Цепочка программ просмотра буфера обмена
- •Функции и сообщения программы просмотра буфера обмена
- •Простая программа просмотра буфера обмена
- •Основные концепции
- •Приложение, раздел и элемент
- •Типы диалогов
- •Символьные строки и атомы
- •Программа сервер DDE
- •Программа DDEPOP1
- •Сообщение WM_DDE_INITIATE
- •Оконная процедура ServerProc
- •Функция PostDataMessage программы DDEPOP1
- •Сообщение WM_DDE_ADVISE
- •Обновление элементов данных
- •Сообщение WM_DDE_UNADVISE
- •Сообщение WM_DDE_TERMINATE
- •Программа-клиент DDE
- •Инициирование диалога DDE
- •Сообщение WM_DDE_DATA
- •Сообщение WM_DDE_TERMINATE
- •Управляющая библиотека DDE
- •Концептуальные различия
- •Реализация DDE с помощью DDEML
- •Элементы MDI
- •Windows 95 и MDI
- •Пример программы
- •Три меню
- •Инициализация программы
- •Создание дочерних окон
- •Дополнительная информация об обработке сообщений в главном окне
- •Дочерние окна документов
- •Освобождение захваченных ресурсов
- •Сила оконной процедуры
- •Основы библиотек
- •Библиотека: одно слово, множество значений
- •Пример простой DLL
- •Разделяемая память в DLL
- •Библиотека STRLIB
- •Точка входа/выхода библиотеки
- •Программа STRPROG
- •Работа программы STRPROG
- •Разделение данных между экземплярами программы STRPROG
- •Некоторые ограничения библиотек
- •Динамическое связывание без импорта
- •Библиотеки, содержащие только ресурсы
- •Глава 20 Что такое OLE?
- •Основы OLE
- •Связь с библиотеками OLE
- •Расшифровка кода результата
- •Интерфейсы модели составного объекта (COM-интерфейсы)
- •Услуги интерфейса IUnknown
- •Является ли OLE спецификацией клиент/сервер?
- •Сервер закрытого компонента
- •IMALLOC.DLL
- •Теперь о макросах
- •Услуги, предоставляемые интерфейсом IUnknown
- •Клиент закрытого компонента
- •Сервер открытого компонента
- •Назначение реестра
- •Способы генерации и использования идентификаторов CLSID
- •Компонент фабрика классов
- •Управление временем жизни сервера
- •Клиент открытого компонента
- •Заключение
242
Перед окончанием работы программа CALLPUB отсоединяется от OLE:
// Отсоединение от библиотек OLE
CoUninitialize( );
Оба вызова необходимы, поскольку программа CALLPUB получает свой интерфейс IMalloc из сервера компонента PUBMEM с помощью вызова функции CoCreateInstance:
HRESULT hr = CoCreateInstance(CLSID_ALLOCATOR, NULL, CLSCTX_INPROC_SERVER, IID_IMalloc,
(void **) &pMalloc);
if(FAILED(hr))
{
MessageBox(hwnd, "Error: No allocator", szAppName, MB_OK); return 0;
}
Эта функция библиотеки OLE ищет в реестре компонент, который может обеспечить класс CLSID_ALLOCATOR, символ, определенный в заголовочном файле PUBMEM.Н. Чтобы заставить это слово выделять память, а не просто ссылаться на дополнительное значение, в список включенных файлов библиотеки PUBMEM добавляется следующее:
#include <initguid.h> #include "pubmem.h"
Когда писалась эта книга были определены три контекста для типов запускаемых серверов (параметр dwClsContext функции CoCreateInstance). CLSCTX_INPROC_SERVER, который запрашивается из PUBMEM, является самостоятельным DLL-сервером. Другим типом DLL-сервера, CLSCTX_INPROC_HANDLER, является локальный обработчик для cервера вне процесса клиента. Он работает как внутренний заменитель сервера процесса (быстрее, с меньшими накладными расходами) до тех пор, пока не понадобится сервер вне процесса. Третий тип контекста, CLSCTX_LOCAL_SERVER, запускается в качестве отдельного процесса на той же машине.
В отличие от закрытой функции CreateAllocator, которая всегда возвращает указатель на интерфейс IMalloc, функция CoCreateInstance позволяет вызывающей процедуре задать тип возвращаемого функцией интерфейса. PUBMEM запрашивает IDD_IMalloc, идентификатор интерфейса IMalloc. Но с тем же результатом она могла бы потребовать идентификатор IDD_IUnknown и затем выполнить вызов функции QueryInterface для указателя на интерфейс IMalloc. Конечно, если бы клиент запомнил оба указателя интерфейса, то для правильного уменьшения счетчика ссылок в конце концов потребовалось бы два вызова функции Release.
Заключение
Это введение в основы модели составного объекта (COM) OLE должно обеспечить хорошую базу для начала работы с технологиями OLE, где бы не пришлось с ними встретиться. Создаются ли контейнеры составных документов или серверы, объекты автоматизации или контроллеры, контейнеры элементов управления OLE или элементы управления OLE — в этой главе описано все, что имеет отношение к интерфейсам модели составного объекта OLE. Услуги оболочки Windows 95 доступны только через интерфейсы модели составного объекта OLE. Даже если вы собираетесь использовать библиотеки классов, например MFC компании Microsoft или OWL компании Borland, то уже при поверхностном знакомстве с ними вы обнаружите в них модель составного объекта
OLE.
Тогда, когда Windows 95 только-только начала появляться перед взорами своих создателей, Microsoft разослал разработчикам программного обеспечения важное сообщение о том, что будущее принадлежит Win32 и OLE. С появлением Windows 95 и обещанным приходом технологий OLE становится ясно, что будущее уже пришло.
Теперь у вас есть все, что нужно для того, чтобы создавать грандиозные приложения для Windows завтрашнего дня.