C O leLinkingDoc

COleLinkingDoc 类 是 OLE 容 器 文 档 的 基 类 , 它 支 持 链 接 到 它 们 所 包 含 的 嵌 入项 。 一 个 支 持 链 接 到 嵌 入 项 的 容 器 应 用 程 序 被 称 为 “ 链 接 容 器 ” 。 示 例 应 用 程序 OCLIENT 就 是 一 个 链 接 容 器 的 例 子 。

当 一 个 链 接 项 的 源 是 另 一 个 文 档 的 嵌 入 项 时 , 则 为 了 使 嵌 入 项 可 以 编 辑 , 那 个包 容 文 档 必 须 被 载 入 。 由 于 这 个 原 因 , 当 用 户 想 要 编 辑 链 接 项 的 源 时 , 容 器 程序 就 必 须 能 够 由 另 一 个 容 器 应 用 程 序 启 动 。 你 的 应 用 程 序 也 必 须 使 用COleTemplateServer 类 以 使 它 在 被 其 它 的 应 用 程 序 启 动 时 能 够 创 建 文 档 。

为 了 使 你 的 容 器 应 用 程 序 成 为 一 个 链 接 容 器 , 请 从 COleLinkingDoc 派 生 出 你的 文 档 类 , 而 不 是 从 COleDocument 派 生 。同 处 理 其 它 任 何 OLE 容 器 程 序 一 样 , 应 用 程 序 必 须 将 自 己 的 类 设 计 为 可 存 储 应 用 程 序 的 本 地 数 据 以 及 嵌 入 或 链 接项 。 而 且 , 你 必 须 为 保 存 你 的 本 地 数 据 设 计 数 据 结 构 。 如 果 你 为 你 的 应 用 程 序的 本 地 数 据 定 义 了 一 个 CDocItem 派 生 类 , 你 就 可 以 使 用 由 COleDocument 定

义 的 界 面 来 保 存 你 的 本 地 数 据 以 及 OLE 数 据 。

为 了 使 你 的 应 用 程 序 能 够 被 另 一 个 容 器 程 序 启 动 , 请 定 义 一 个

COleTemplateServer 对 象 作 为 你 的 应 用 程 序 的 CWinApp 派 生 类 的 成 员 。

class COleClientApp : public CWinApp

{

// ... protected:

COleTemplateServer m_server;

// ...

};

在 你 的 CWinApp 派 生 类 的 成 员 函 数 InitInstance 中 , 创 建 一 个 文 档 模 板 并 指 定你 的 COleLinkingDoc-derived 类 为 一 个 文 档 类 :

// CMainDoc is derived from COleLinkingDoc

CMultiDocTemplate* pDocTemplate = new CMultiDocTemplate(IDR_OCLIENTTYPE,

RUNTIME_CLASS(CMainDoc),

RUNTIME_CLASS(CSplitFrame),

RUNTIME_CLASS(CMainView));

pDocTemplate->SetContainerInfo(

IDR_OCLIENTTYPE_CNTR_IP);

AddDocTemplate(pDocTemplate);

通 过 调 用 COleTemplateSe rver 对 象 的 ConnectTemplate 成 员 函 数 , 将 此COleTemplateServer 对 象 连 接 到 你 的 文 档 模 板 , 并 通 过 调 用COleTemplateServer::RegisterAll 函 数 向 OLE 系 统 注 册 所 有 的 类 对 象 。

m_server.ConnectTemplate(clsid, pDocTemplate, FALSE); COleTemplateServer::RegisterAll();

C W inApp 派 生 类 的 定 义 和 InitInstance 函 数 的 示 例 ,请 参 见 MFC 示例 OCLIENT

中 的 OCLIENT.H 和 OCLIENT.CPP 。

如 果 要 获 取 有 关 使 用 COleLinkingDoc 的 更 多 信 息 , 请 参 见 “ Visual C++ 程 序 员指 南 ” 一 书 中 的 文 章 “ 容 器 : 实 现 一 个 容 器 ” 。

#include <afxole.h>

请 参 阅 CDocTemplate

CO leLinkingDoc 类 成 员

Construction

ColeLinkingDoc 构 造 一 个 COleLinkingDoc 对象

Operations

Register 向 OLE 系 统 DLL 注 册 此 文 档

Revoke 撤 消 文 档 的 注 册

Overridables

OnFindEmbeddedItem 查 找 指 定 的 嵌 入 项

OnGetLinkedItem 查 找 指 定 的 链 接 项

成 员 函 数

CO leLinkingDoc::COleLinkingDoc

COleLinkingDoc();

说 明

此 函 数 构 造 一 个 COleLinkingDoc 对 象 , 但 不 开 始 与 OLE 系 统 DLL 的 通 信 。 应用 程 序 必 须 调 用 成 员 函 数 Register 通 知 OLE 文 档 已 经 打 开 。

请 参 阅 COleLinkingDoc::Register

CO leLinkingDoc::OnFindEmbeddedItem

virtual COleClientItem* OnFindEmbeddedItem( LPCTSTR lpszItemName );

返 回 值

返 回 一 个 指 向 指 定 项 的 指 针 ; 如 果 没 有 找 到 该 项 则 返 回 NULL 。

参 数

lpszItemName

指 向 所 请 求 的 嵌 入 OLE 项 名 称 的 指 针 。

说 明

框 架 调 用 此 函 数 来 确 定 文 档 中 是 否 包 含 一 个 具 有 指 定 名 称 的 嵌 入 OLE 项 。 此函 数 的 缺 省 实 现 是 在 嵌 入 项 表 中 查 找 具 有 指 定 名 称 的 项 ( 名 字 比 较 区 分 大 小写 ) 。 如 果 你 有 你 自 己 的 存 储 或 命 名 嵌 入 OLE 项 的 方 式 , 请 重 载 该 函 数 。

请 参 阅 COleClientItem , COleLinkingDoc::OnGetLinkedItem

CO leLinkingDoc::OnGetLinkedItem

virtual COleServerItem* OnGetLinkedItem( LPCTSTR lpszItemName );

返 回 值

指 向 指 定 项 的 指 针 ; 如 果 没 有 找 到 该 项 则 返 回 NULL 。

参 数

lpszItemName

指 向 所 请 求 的 链 接 OLE 项 名 字 的 指 针 。

说 明

框 架 调 用 该 函 数 检 查 文 档 中 是 否 包 含 一 个 具 有 指 定 名 字 的 链 接 服 务 器 项 。 缺 省的 COleLinkingDoc 实 现 总 是 返 回 NULL 。 该 格 式 在 派 生 类 COleServerDoc 中被

重 载 , 用 来 在 OLE 服 务 器 项 表 中 查 找 一 个 具 有 指 定 名 称 的 链 接 项 ( 名 字 比 较区 分 大 小 写 ) 。 如 果 你 已 经 实 现 了 你 自 己 的 存 储 或 检 索 嵌 入 OLE 项 的 方 式 , 则 重 载 该 函 数 。

请 参 阅 COleServerItem::GetItemNam e, COleServerItem::SetItemNam e, COleLinkingDoc::OnFindEmbeddedItem

CO leLinkingDoc::Register

BOOL Register(COleObjectFactory* pFactory , LPCTSTR lpszPathName );

返 回 值

如 果 成 功 注 册 文 档 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

pFactory

指 向 一 个 OLE 库 对 象 的 指 针 ( 可 以 是 NULL ) 。

lpszPathName

指 向 容 器 文 档 的 全 路 径 的 指 针 。

说 明

此 函 数 通 知 OLE 系 统 DLL , 文 档 是 打 开 的 。 该 函 数 在 创 建 或 打 开 一 个 已 命 名文 件 时 被 调 用 , 用 来 向 OLE 系 统 DLL 注 册 此 文 档 。 如 果 文 档 代 表 一 个 嵌 入 项 , 则 不 需 要 调 用 这 个 函 数 。

如 果 在 你 的 应 用 程 序 中 正 使 用 COleTemplateServer, 则 由 COleLinkingDoc 实现的 函 数 OnNewDocument , OnOpenDocument 和 OnSaveDocument 来 调 用Register。

请 参 阅 COleTemplateServer , COleObjectFactory ,

CDocument::OnNewDocumen t,

CDocument::OnOpenDocument

CO leLinkingDoc::Revoke

void Revoke();

说 明

此 函 数 通 知 OLE 系 统 DLL 文 档 不 再 是 打 开 的 。 该 函 数 从 OLE 系 统 DLL 中 撤销 文 档 的 注 册 。

当 关 闭 一 个 已 命 名 文 件 时 , 你 必 须 调 用 这 个 函 数 , 但 是 通 常 不 需 要 直 接 调 用 它 。由 COleLinkingDoc 实 现 的 函 数 OnNewDocument , OnOpenDocument 和OnSaveDocument 来 调 用 Register。

请 参 阅 COleTemplateServer, CDocument::OnCloseDocument,

CDocument::OnNewDocument , CDocument::OnOpenDocumen t, CDocument::OnSaveDocument