OLE简介

OLE 背景知识

OLE 是一种机制,它允许用户创建和编辑包含由多个应用程序创建的项或者“对象”的文档。

注意   OLE 最初是对象链接和嵌入 (Object Linking and Embedding) 的首字母缩写词,但现在被称为 OLE。OLE 中与链接和嵌入无关的部分现在已成为 Active 技术的一部分。

OLE 文档(过去被称为复合文档)无缝地集成了各种类型的数据或组件。声音剪辑、电子表格和位图是 OLE 文档组件的典型示例。应用程序中的 OLE 支持使用户能够使用 OLE 文档,而不必考虑在不同的应用程序之间切换;因为该切换由 OLE 完成。

您使用容器应用程序创建复合文档,使用服务器应用程序或组件应用程序在容器文档中创建项。编写的任何应用程序可以是一个容器、一个服务器或既是容器又是服务器。

为了实现应用程序之间的无缝交互,OLE 纳入了许多不同的概念。这些概念包括:

链接和嵌入
链接和嵌入是存储项的两种方法,这里的项是在由另一应用程序创建的 OLE 文档内创建的。

在容器应用程序中可以使用“粘贴”命令创建嵌入组件或嵌入项。嵌入项的源数据作为包含嵌入项的 OLE 文档的一部分进行存储。按照这种方式,字处理器文档的文档文件既可以包含文本,也可以包含位图、图形、公式或者其他任何数据类型。

OLE 提供了另一种并入其他应用程序的数据的方法:创建链接组件、链接项或链接。创建链接项的步骤与创建嵌入项的步骤类似,不同之处在于使用的是“粘贴链接”命令,而不是“粘贴”命令。与嵌入组件不同,链接组件存储原始数据(常在单独文件中)的路径。

例如,如果正在字处理器文档中工作,并且创建了到某些电子表格单元格的链接项,则该链接项的数据就存储在原始电子表格文档中。字处理器文档只包含指定可在何处找到该项的信息,也就是说只包含到原始电子表格文档的链接。双击这些单元格时,就会启动电子表格应用程序,并从存储原始电子表格文档的地方加载原始电子表格文档。

无论是嵌入项还是链接项,每个 OLE 项都有一个基于创建该项的应用程序的关联类型。例如,Microsoft Paintbrush 项是一种类型的项,Microsoft Excel 项是另一种类型的项。不过,有些应用程序可以创建不止一种项类型。例如,Microsoft Excel 可以创建工作表项、图表项和宏表项。这些项中的每一个都可通过类标识符或 CLSID 由系统唯一标识。

就地激活(可视化编辑)

激活容器文档上下文中的嵌入项称为就地激活或可视化编辑。容器应用程序的接口发生改变,从而并入创建嵌入项的组件应用程序的功能。链接项永远不能就地激活,因为该项的实际数据包含在一个单独的文件中,不在包含链接的应用程序上下文中。
注意   链接和嵌入以及就地激活是 OLE 可视化编辑的主要功能。
自动化
自动化允许一个应用程序驱动另外一个应用程序。驱动应用程序称为自动化客户端,被驱动的应用程序称为自动化服务器或者自动化组件。。
注意   自动化在 OLE 和 Active 技术上下文中均有效。可以自动化任何基于 COM 的对象。
复合文件
复合文件为 OLE 应用程序提供了一个标准文件格式,用以简化复合文档的结构化存储。在复合文件中,存储具备目录的许多功能,而流具备文件的许多功能。这项技术也称作结构化存储。

统一数据传输

统一数据传输 (UDT) 是一个接口集,它使数据能够以标准方式发送和接收,不论实际选择的数据传输方法是什么。UDT 形成了通过拖放传输数据的基础。UDT 目前是现有 Windows 数据传输,如剪贴板和动态数据交换 (DDE),的基础。
拖放
拖放是一项易于使用、可直接操作的技术,该技术在应用程序之间、应用程序中的窗口之间,甚至在应用程序的同一个窗口内传输数据。要传输的数据被选中然后拖到希望的目标。拖放技术的基础是统一数据传输。
组件对象模型
组件对象模型 (COM) 是 OLE 对象相互之间通信时使用的结构。MFC OLE 类为程序员简化了 COM。COM 是 Active 技术的一部分,因为 COM 对象是 OLE 和 Active 技术的基础。

 容器和服务器

         容器应用程序是可将嵌入项或者链接项并入自己的文档中的应用程序。容器应用程序管理的文档必须能够存储和显示 OLE 文档组件以及应用程序自身创建的数据。容器应用程序还必须使用户能够在必要时通过激活服务器应用程序插入新项或者编辑现有项。

服务器应用程序或组件应用程序是能够创建供容器应用程序使用的 OLE 文档组件的应用程序。服务器应用程序通常支持拖放或者支持将数据复制到剪贴板,以使容器应用程序可以将数据作为嵌入项或链接项插入。应用程序可以同时是容器和服务器。

多数服务器都是独立的应用程序或者是完全服务器;它们既可以作为一个独立的应用程序运行,也可以由容器应用程序启动。袖珍服务器是服务器应用程序中的一种特殊类型,它只能由容器启动,而不能作为独立的应用程序运行。Microsoft Draw 和 Microsoft Graph 服务器即属于袖珍服务器。

容器和服务器之间不直接通信,而是通过 OLE 系统动态链接库 (DLL) 进行通信。这些 DLL 提供容器和服务器调用的函数,而容器和服务器又提供 DLL 调用的回调函数。

使用这种通信方式,容器不需要知道服务器应用程序的实现细节。它允许容器不必定义它适用的服务器类型,就可接受任何服务器创建的项。因此,容器应用程序的用户可充分利用将来的应用程序和数据格式。只要这些新应用程序是 OLE 组件,复合文档就能够并入那些应用程序创建的项。

从MSDN里找到的,做个备忘,呵呵,OLE是个好东西,可以提供不同程序之间的接口.

/* cole - A free C OLE library. cole_extract - Extract a file from a filesystem. Copyright 1998, 1999 Roberto Arturo Tena Sanchez This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Arturo Tena */ #include /* To compile this file outside cole source tree, you must include here instead */ #include "cole.h" #define PRGNAME "iOLE" #define BUFFER_SIZE 128 int main(int argc, char **argv) { COLEFS *cfs; COLEFILE *cf; COLERRNO colerrno; char buffer[BUFFER_SIZE]; size_t char_read; if (argc != 3) { fprintf(stderr, "cole_extract. Extract a file from a " "filesystem to the standard output.\n" "Usage: "PRGNAME" \n" " FILE - File with the filesystem.\n" " INFILE - Filename of the file to extract.\n"); exit(1); } printf("%s",argv[1]); cfs = cole_mount(argv[1], &colerrno); if (cfs == NULL) { cole_perror(PRGNAME, colerrno); exit(1); } cf = cole_fopen(cfs, argv[2], &colerrno); if (cf == NULL) { cole_perror(PRGNAME, colerrno); cole_umount(cfs, NULL); exit(1); } while ((char_read = cole_fread(cf, buffer, BUFFER_SIZE, &colerrno))) { if (fwrite(buffer, 1, char_read, stdout) != char_read) { break; } } if (!cole_feof(cf)) { cole_perror(PRGNAME, colerrno); cole_umount(cfs, NULL); exit(1); } if (cole_fclose(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值