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