StoServe 概述

目的

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

功能

StoServe 示例引入了 COPaper COM 对象,该对象实际上表示一张空白绘图纸。

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

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

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

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

IPAPER 中声明了两个 IPaper 和 IPaperSink 自定义接口。H 位于公共同级 \INC 目录中。 接口和对象的 GUID 在 PAPGUIDS 中定义。H 位于同一通用包含目录中。

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

COPaper COM 对象

COPaper COM 对象是由此 StoServe 进程内服务器管理的单个对象类型。 COPaper 构造为具有标准 IConnectionPointContainer 接口实现和自定义 IPaper 接口实现的可连接的 COM 对象。 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 (DCOM) 的 COM 支持支持跨网络使用这种类型的工作组应用程序。 有关详细信息,请参阅前面的 REMCLIEN 示例。

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

支持信息

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

有关设置系统以生成和测试此 COM 教程系列中的代码示例的详细信息,请参阅 如何生成示例。 提供的 makefile (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 中正确设置目录路径。 有关详细信息,请参阅 如何生成示例