Обзор StoServe
Цель
Основное внимание в этом примере кода уделяется использованию служб структурированного хранилища, как показано в реализации составных файлов. Описывается использование стандартных интерфейсов IStorage и интерфейсов IStream. StoServe работает с примером кода StoClien, чтобы проиллюстрировать совместное использование составного хранилища файлов клиентом и сервером.
Функциональность
В примере StoServe представлен объект COM COPaper, который виртуально представляет пустой лист бумаги для черчения.
Объекты COPaper предоставляют набор функций для рисования свободной формы на поверхности бумаги с помощью чернил заданного цвета и ширины. Функциональность по виду похожа на примеры из учебных пособий "scribble" во многих версиях Microsoft Visual C++. Разница в образцах StoServe/StoClien заключается в архитектуре, основанной главным образом на технологии COM. Функции электронной чертежной бумаги для объектов COPaper доступны клиентам через настраиваемый интерфейс IPaper. COPaper реализует интерфейс IPaper. Четкое различие архитектуры сохраняется между клиентом и сервером. Графический пользовательский интерфейс (GUI) не предоставляется COPaper. Проектирование объекта COPaper полагается на клиента для всего поведения пользовательского интерфейса. COPaper инкапсулирует только серверную запись и хранение рисованных рукописных данных.
Данные рукописного ввода, нарисованные на поверхности COPaper, могут храниться и загружаться из составных файлов. Методы IPaperSave и Load принимают указатель интерфейса IStorage. COPaper использует предоставленный клиентом интерфейс IStorage для хранения данных чертежа.
COPaper размещается на сервере внутри процесса и становится общедоступным в качестве пользовательского COM-компонента. Аналогично другим серверам в этом руководстве, StoServe — это саморегистрирующийСЯ COM-сервер. Он делает тип объекта COPaper доступным для клиентов в качестве компонента DllPaper с помощью регистрации CLSID_DllPaper в реестре.
Как и на предыдущем сервере CONSERVE, функции подключаемого объекта поддерживаются в COPaper. Интерфейс IConnectionPointContainer предоставляется, и соответствующая точка подключения реализуется. В этом контексте исходящий пользовательский интерфейс IPaperSink объявляется для использования при отправке уведомлений клиенту.
Два пользовательских интерфейса IPaper и IPaperSink объявлены в IPAPER.H, расположенном в общем каталоге \INC. Идентификаторы GUID для интерфейсов и объектов определены в PAPGUIDS.H, расположенном в той же общей директории include.
Объект CThreaded в APPUTIL используется StoServe для обеспечения безопасности потоков, как в примере FRESERVE. Объекты COPaper являются производными от класса CThreaded и наследуют свои методы OwnThis и UnOwnThis. Эти методы позволяют только одному потоку за раз иметь доступ к серверу StoServe и к объектам COPaper, управляемым сервером.
COM-объект COPaper
COM-объект COPaper — это единственный тип объекта, управляемый этим стосервом сервером, работающим внутри процесса. COPaper создается в виде подключаемого COM-объекта с реализацией стандартного интерфейса IConnectionPointContainer и с реализацией пользовательского интерфейса IPaper. COPaper предоставляет интерфейс IPaper, чтобы клиенты могли выполнять небольшой набор электронных бумажных операций на экземпляре COPaper. Основные операции включают запуск последовательности для рисования чернилами, нанесение данных на виртуальную бумагу COPaper и завершение этой последовательности. В этой схеме клиент считается приложением графического интерфейса, управляемым мышью или планшетным устройством. Клиент отвечает за преобразование перемещения мыши в запросы к COPaper, что сохраняет эти запросы в виде рукописных данных.
В COPaper есть два уровня сохранения данных о чернилах. COPaper сохраняет данные чернил в массиве на основе ОЗУ, представляющем текущий рисунок, и COPaper сохраняет весь рисунок на постоянной основе в составном файле. Методы в интерфейсе IPaper выполняют оба.
Так как клиент не управляет данными о нарисованной бумаге, но отвечает за его отображение как изображения на экране, реализация IPaper в COPaper должна предоставлять метод, позволяющий клиенту получать данные о рисунке. Для этой цели используется технология подключаемого объекта в COPaper. Точка подключения CONNPOINT_PAPERSINK реализована в COPaper, позволяя клиенту подключиться к COPaper для получения данных о чернилах, используемых для рисования. Клиент сначала вызывает метод IPaper::Redraw объекта COPaper, чтобы запросить все данные чернил текущего рисунка. Реализация COPaper Redraw затем использует клиентскую реализацию IPaperSink для передачи данных клиенту.
По мере того как пользователь интерактивно рисует в клиенте, он закрашивает данные сразу на экран, а также отправляет его в COPaper для сохранения. Когда клиенту необходимо перерисовка экрана, он вызывает метод COPaper Redraw. Такая перерисовка распространена в приложениях. Например, перерисовка происходит, когда окно клиента закрыто другим окном приложения. У клиента есть растровое изображение, но оно легко теряется, и его часто приходится перерисовывать. Клиент полагается на COPaper на сервере для данных о чернилах, необходимых для перекраски.
Это типичное деление труда между клиентом и сервером. Особенно важно, если для нескольких клиентов требуется предоставить общий доступ к данным. COPaper запрограммирован так, чтобы обеспечить эту возможность. Он использует функциональность APPUTIL CThreaded для обеспечения потокобезопасности. Приложение, которое может использовать эту конструкцию, является приложением для совместной работы на интерактивной доске, где несколько клиентов могут вносить вклад в общий рисунок. Поддержка COM для распределенного COM (DCOM) поддерживает этот тип использования приложений рабочей группы в сети. Дополнительные сведения см. в предыдущем примере REMCLIEN.
Более скромное использование схемы клиента и сервера COPaper заключается в интеграции поведения для объектов, реализованных в разных приложениях на одном компьютере. В этом случае клиенты могут быть контейнером ActiveX в отдельных приложениях, которые совместно используют данные, управляемые тем же объектом. Эти данные могут не быть данными рукописного рисования, поддерживаемыми компонентом DllPaper. StoServe можно использовать в качестве начальной платформы для компонентов программирования, которые управляют другими типами общих данных.
Сведения о поддержке
StoServe makefile регистрирует компонент StoServe DLLPaper COM в реестре. Этот компонент необходимо зарегистрировать, прежде чем StoServe доступен для внешних клиентов COM в качестве сервера для этого компонента. Эта самостоятельная регистрация выполняется с помощью программы Register.exe, встроенной в пример REGISTER. Чтобы создать или запустить StoServe, сначала создайте пример кода REGISTER.
Дополнительные сведения о настройке системы для создания и тестирования примеров кода в этой серии учебников COM см. в разделе Сборка примеров. Предоставленный файл makefile (MAKEFILE) совместим с Microsoft NMAKE. Чтобы создать отладочную сборку, выполните команду NMAKE в окне командной строки.
Для удобного использования в Microsoft Visual Studio для каждого примера предоставляется файл проекта. Чтобы загрузить проект для примера StoServe, можно запустить Visual Studio в командной строке в каталоге примеров следующим образом:
MSDEV STOSERVE.DSP
Вы также можете дважды щелкнуть файл Stoserve.dsp в проводнике Windows, чтобы загрузить пример проекта в Visual Studio. В Visual Studio можно изучать классы C++ образца исходного кода и проводить редактирование, компиляцию и отладку.
Заметка
В рамках пакета Platform Software Development Kit (SDK) компиляция этих примеров из Visual Studio требует правильной установки путей к директориям в Visual Studio. Дополнительные сведения см. в Как собрать примеры.