StoServe 概述

用途

此代码示例的主要重点是使用复合文件实现中提供的结构化存储服务。 介绍了标准 IStorageIStream 接口的使用。 StoServeStoClien 代码示例配合使用,以说明客户端和服务器联合使用复合文件存储。

功能

StoServe 示例引入了 COPaper COM 对象,该对象几乎代表绘图纸的空白工作表。

COPaper 对象使用指定颜色和宽度的“墨迹”在纸张图面上公开一组自由格式绘图的特征。 此功能与许多版本的Microsoft Visual C++中的“scribble”教程示例类似。 StoServeStoClien/ 示例的差异主要基于 COM 技术。 COPaper 对象的电子绘图纸功能可通过自定义 IPaper 接口提供给客户端。 COPaper 实现 IPaper 接口。 客户端和服务器之间保持明确的体系结构区别。 COPaper 不提供图形用户界面 (GUI) 。 COPaper 对象的设计依赖于客户端进行所有 GUI 行为。 COPaper 仅封装基于服务器的墨迹数据的捕获和存储。

在 COPaper 图面上绘制的墨迹数据可以存储在复合文件中并从中加载。 IPaperSaveLoad 方法接受 IStorage 接口指针。 COPaper 使用此客户端提供的 IStorage 接口来存储绘图数据。

COPaper 位于进程内服务器中,作为自定义 COM 组件公开发布。 与本教程系列中的其他服务器类似,StoServe 是自注册 COM 服务器。 它使 COPaper 对象类型可供客户端作为 DllPaper 组件使用注册表中的CLSID_DllPaper注册。

与以前的 CONSERVE 服务器一样,COPaper 支持可连接对象功能。 IConnectionPointContainer 接口公开,并实现适当的连接点。 在此上下文中,将声明传出的自定义 IPaperSink 接口用于向客户端发送通知。

这两个 IPaperIPaperSink 自定义接口在 IPAPER 中声明。H 位于公共同级 \INC 目录中。 接口和对象的 GUID 在 PAPGUIDS 中定义。位于同一常见包含目录中的 H。

APPUTIL 中的 CThreaded 设施由 StoServe 用来实现线程安全性,就像在 FRESERVE 示例中一样。 COPaper 对象派生自 CThreaded 类,并继承其 OwnThis 和 UnOwnThis 方法。 这些方法一次只允许一个线程访问 StoServe 服务器和由服务器管理的 COPaper 对象。

COPaper COM 对象

COPaper COM 对象是由此 StoServe 进程内服务器管理的单个对象类型。 COPaper 构造为可连接 COM 对象,其中包含标准 IConnectionPointContainer 接口的实现和自定义 IPaper 接口的实现。 COPaper 公开 IPaper 接口,以便客户端可以在 COPaper 实例上执行一组小型电子纸张操作。 基本操作是启动墨迹绘图序列、在 COPaper 虚拟纸图面上绘制墨迹数据以及结束墨迹绘图序列。 在此方案中,客户端假定为由鼠标或平板电脑设备驱动的 GUI 应用程序。 客户端负责将鼠标移动转换为 COPaper 的请求,从而将这些请求保存为墨迹数据。

在 COPaper 中保存墨迹数据有两个级别。 COPaper 将墨迹数据保存在代表当前绘图的基于 RAM 的数组中,COPaper 将整个绘图持久保存到复合文件中。 IPaper 接口中的方法执行这两个操作。

由于客户端不管理绘制的纸张数据,但负责将其呈现为屏幕上的图像,因此 COPaper 中的 IPaper 实现必须公开一种方法,使客户端能够获取绘图数据。 COPaper 中的可连接对象技术用于此目的。 CONNPOINT_PAPERSINK连接点由 COPaper 实现,以便客户端可以连接到 COPaper 来接收绘图的墨迹数据。 客户端首先调用 COPaper 对象上的 IPaper::Redraw 方法以请求当前绘图的所有墨迹数据。 然后,Redraw 的 COPaper 实现使用 IPaperSink 的客户端实现将数据传递给客户端。

当用户以交互方式在客户端中绘制时,它会立即将数据绘制到屏幕,同时将其发送到 COPaper 进行保存。 当客户端要求重新绘制屏幕时,它会调用 COPaper Redraw 方法。 此类重新绘制在应用程序中很常见。 例如,当客户端窗口被另一个应用程序窗口覆盖时,会发生重新绘制。 客户端具有绘制图像的位图呈现,但位图很容易丢失,并且必须经常重新绘制。 客户端依赖于服务器上的 COPaper,以获取重新绘制所需的墨迹数据。

这是常见的客户端/服务器分工。 当要求多个客户端共享数据时,尤其合适。 COPaper 编码为启用此功能。 它使用 APPUTIL CThreaded 设施来实现线程安全性。 利用此设计的应用程序是一个共享白板应用程序,其中多个客户端可以参与通常查看的绘图。 COM 对分布式 COM (DCOM) 支持跨网络使用这种类型的工作组应用程序。 有关详细信息,请参阅前面的 REMCLIEN 示例。

COPaper 客户端/服务器方案的一个更适度的使用是集成同一台计算机上不同应用程序中实现的对象的行为。 在这种情况下,客户端可能是共享由同一对象管理的数据的单独应用程序中的ActiveX容器。 此数据可能不是 DllPaper 组件支持的墨迹绘图数据。 StoServe 可用作用于管理其他类型的共享数据的编程组件的起始框架。

支持信息

StoServe makefile 在注册表中注册 StoServe DllPaper COM 组件。 必须在 StoServe 作为该组件的服务器提供给 COM 客户端外部之前注册此组件。 此自注册是使用 REGISTER 示例中内置的Register.exe实用工具完成的。 若要生成或运行 StoServe,请先生成 REGISTER 代码示例。

有关设置系统以生成和测试此 COM 教程系列中的代码示例的详细信息,请参阅 “如何生成示例”。 提供的生成文件 (MAKEFILE) 与 Microsoft NMAKE 兼容。 若要创建调试生成,请在命令提示符窗口中发出 NMAKE 命令。

为了方便在Microsoft Visual Studio中使用,为每个示例提供项目文件。 若要加载 StoServe 示例的项目,可以在示例目录中的命令提示符处运行Visual Studio,如下所示:

MSDEV STOSERVE。DSP

还可以双击 Windows 资源管理器中的 Stoserve.dsp 文件,将示例项目加载到 Visual Studio。 在Visual Studio,可以浏览示例源的 C++ 类,并通常执行其他编辑-编译-调试操作。

注意

作为平台软件开发工具包 (SDK) 的一部分,从Visual Studio内部编译这些示例需要正确设置Visual Studio中的目录路径。 有关详细信息,请参阅 如何生成示例