
X3 插件基础模块
使用说明书
编写人:张云贵
编写日期:2010-9-30

X3 插件基础_模块使用说明书.doc 第 2 页 共 14 页
文档修订记录
版本
编号
说明:如形成文件、变更
内容和变更范围
日期
执行人
批准日期
批准人
V0.1
形成文件
2010-9-28
张云贵
YYYY-MM-DD
V0.2
在附件中增加内容
2010-11-8
张云贵

X3 插件基础_模块使用说明书.doc 第 3 页 共 14 页
1. 属性信息
模块名称: X3 插件基础
版本号: 3.0
运行平台: Windows
采用编程语言: C++
分类: 插件框架
共享方式: 源代码
关键词: X3 插件 框架 COM
开发经理: 张云贵
开发人员: 张云贵
开源网站: http://dmkb.hold.founder.com/trac/x3 (外网地址见下)
2. 重用模块概述
X3 插件基础模块是“X3 插件框架”的最底层独立模块,用于形成其他插件模块。X3
插件框架的设计目标是汇集各种常用的轻量级 C++插件通用模块,其插件既能灵活组合到各
种系统,又能单独拆开使用。“X3”是开发代号,不是版本号。
X3 插件基础模块用于开发具有统一接口标准的 C++插件模块,使其具有 COM 组件的
多种特点(接口与实现分离、一个实现类支持多个接口、引用计数管理、模块独立编译、透
明部署、模块可替换等),同时简单易用、轻量化,这样开发人员就能简便快捷的开发出可
重用、易于测试的规范模块。
本模块所提供的插件机制是 2008 年 3 月从飞腾创艺插件 SDK 中经过大量的简化而来,
并结合常见的桌面应用开发的实际需要改编,经过了至少 8 个系统的实际成功验证。
X3 插件框架在公司范围内开放源代码,最新版本可从“数媒知识库”网站下载,如有
需求、改进建议、BUG 上报,可在此网站上提出。如果无法访问公司局域网,则可访问外
网地址,首次访问时需要输入公司域帐户。
2.1.1. 插件原理
插件原理如图 1 所示,所有插件都是普通 DLL,通过在工程内包含辅助文件自动实现
了统一的导出函数,通过该导出函数就能获取到在该插件内所实现的所有接口的信息及对象
创建函数地址;主程序使用插件管理器(PluginManager)加载这些 DLL,插件管理器通过
这个导出函数将各个类 ID、对象创建函数地址统一管理起来,从而在插件管理器的中介作
用下让各个插件能相互使用各种接口函数。

X3 插件基础_模块使用说明书.doc 第 4 页 共 14 页
插件管理器
插件2
插件1
组件类1
Interface
组件类2
Interface1
Interface2
组件类3
Interface
组件类4
Interface1
Interface2
图 1
2.1.2. 本模块的特点
采用本模块提供的机制和代码文件来开发插件模块,具有下列主要特点:
接口定义简单灵活
采用普通的 C++接口,即由纯虚函数组成的结构体,不需要特殊的基类,不需要宏
和 UUID 申明;同时可以使用 C++的各种变量类型,不受 COM 接口那样的约束。
例如下面的接口 Ix_定义:
interface Ix_Example
{
virtual void Foo() = 0;
virtual void* GetData(std::vector<int>& items) = 0;
};
接口与实现分离
对外提供接口文件,在插件内部用类来实现一个或多个接口,不需要对外导出该类
或暴露实现细节。这样还有一个好处是只有约定了接口就可以让多个模块并行开
发,模块相互之间不存在编译依赖(不需要其他插件的 LIB 等文件),这可用于测
试驱动开发模式。
多接口转换、引用计数管理
采用智能指针类来管理接口的引用计数及生命期,可从一个接口动态转换为另一个
接口(内部采用 C++的 RTTI 机制动态转换),可以区分插件内部的接口引用和插
件外部的接口引用。
模块透明部署
一个模块只需要使用其他模块的接口,不需要关心该接口是在哪个插件中实现的。
可以根据需要将各个实现类进行合并或拆分,使其分布到不同插件中,而接口使用
者不受影响。另外,插件部署于哪个目录也不影响插件接口的使用。

X3 插件基础_模块使用说明书.doc 第 5 页 共 14 页
模块可替换、可扩展
可根据需要替换某个插件,只有该插件实现了相同的接口,即使内部功能不相同,
这样就实现了插件可替换、按需组合。通过在新的插件中支持更多的接口,可扩展
更多的功能。可以在新插件中局部替换原有插件的某些接口或部分函数,实现重用
和扩展。
线程安全性
本插件机制所提供的内部实现文件考虑了线程安全性,允许多线程访问而不冲突,
同时采用的是轻量级的锁定机制(计数原子锁定),运行开销很小。
跨版本
允许不同版本的 VC++开发的插件相互调用对方的接口,虽然实际中一般不需要这
样做。由于没有采用 VC++特殊的编译指令,因此容易移植到其他开发平台下。
3. 重用模块使用说明
3.1. 编译运行环境
本插件机制采用 C++实现,用到了 C++的 RTTI 机制和少量 Windows API 函数,没有使
用 MFC、ATL、STL,没有使用 LIB 文件,外部依赖文件少,没有使用 VC++特殊编译指令。
编译环境为 Visual C++ 6.0/2003/2005/2008/2010,其他 C++开发平台下待测试。
运行环境为 Windows 2000 及以后的操作系统,Windows 98 需要安装 UNICODE 支持包。
3.2. 使用方法--开发插件
3.2.1. 定义接口
在 H 文件中定义接口(即纯虚函数组成的结构体),在一个 H 文件中可定义一个或多个
接口。例如下面的 Ix_Example.h:
#pragma once
interface Ix_Example
{
virtual void Foo() = 0;
virtual void* GetData(std::vector<int>& items) = 0;
};
- 1
- 2
- 3
- 4
- 5
前往页