时,它并没有象包容那样重新实现此接口并显式的将调用请求转发给内部组件。相反,外部组件直接把内部组件的接口指针返回给客户。使用这种方法,外部组件将无需重新实现并转发接口中的所有函数了。
包容和聚合为实现组件的复用提供了一种极具鲁棒性的机制。在组件构架下,客户于组件的实现完全隔离开了。
2.3 插件简介
插件是一类特殊的组件。它的目的不是为一般应用程序使用,而是专为特定的应用程序使用。插件一般在宿主应用程序上添加控制项,如菜单、工具按键等。插件响应宿主程序中对这些项目的操作,并对宿主程序中的数据进行特定操作。
3 需求分析和方案设计
3.1 需求分析
3.1.1功能需求
用户在编辑完文档后可以选择把文档全部内容或部分内容加密生成密文,同样点击插件中的解密按纽可以把密文还原为明文。 系统功能流程图见图2:
第 8 页 共 20 页
DES解密Word内容
DES加密Word内容
保存Word内容
图2 系统功能流程图
3.1.2 开发环境
本插件在word2003下开发,可以在Windows2000/2003/xp等操作系统下运行。开
发环境配置表,如表1:
表1系统配置表 处理器:Intel PII 450 或更好 硬件 内 存:256 M 或更大 硬 盘:20 G 或更大 PC Microsoft Windows NT Server 4.0 或更高版本 软件 Microsoft Office 2003
3.2 方案设计
此功能的实现包括了DES算法的实现和插件的实现。可以用VB编写Word插件, VB以其开发的易学好用和强大的用户界面设计能力倍受程序员的青睐,是微软公司推出的开发Windows应用程序的主力平台之一。但其不能直接对寄存器进行操作,没有直接的输入输出端口操作语句,考虑到DES算法的效率与实现等问题,必须借助其他编程语言,而C/C++语言具备较高的运行效率,所以可以通过在VC环境下编写出高效的DES算法代码的动态链接库(DLL),然后在VB中调用。
第 9 页 共 20 页
运行加密插件
加密 调用DES加密模块 DES算法模块 调用DES解密模块 解密 Word内容加密 Word内容解密
图3 系统设计流程图
4 程序的实现
4.1 VC建立DES算法模块
新建Win32动态库工程,如下图所示:
图4 建立Win32动态库工程
4.1.1 加密导出函数的定义
void __stdcall Encode(char *sInput, char *sOutput) //sInput输入字符串,sOutput输出字符串 { char buf[1024]; //定义1024字节的缓冲变量 memset(buf, 0x00, sizeof(buf)); //缓冲区清零 Des_Go(buf, sInput, sizeof(sInput), key, sizeof(key), ENCRYPT); //加密函数 strcpy(sOutput,buf); //将加密后的字符串输出 }
第 10 页 共 20 页
4.1.2解密导出函数的定义
void __stdcall Decode(char *sInput, char *sOutput) //sInput输入字符串,sOutput输出字符串 { char buf[1024]; //定义1024字节的缓冲变量 memset(buf, 0x00, sizeof(buf)); //缓冲区清零 Des_Go(buf, sInput, sizeof(sInput), key, sizeof(key), DECRYPT); //解密函数 strcpy(sOutput,buf); //将加密后的字符串输出 }
4.1.3加解密相关函数的声名
typedef bool (*PSubKey)[16][48];
static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);/标准DES加/解密
static void SetKey(const char* Key, int len);// 设置密钥
static void SetSubKey(PSubKey pSubKey, const char Key[8]);//设置子密钥 static void F_func(bool In[32], const bool Ki[48]);// f 函数 static void S_func(bool Out[32], const bool In[48]);// s 盒代替
static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换 static void Xor(bool *InA, const bool *InB, int len);// 异或 static void RotateL(bool *In, int len, int loop);// 循环左移
static void ByteToBit(bool *Out, const char *In, int bits);//字节组转换成位组 static void BitToByte(char *Out, const bool *In, int bits);//位组转换成字节组 static bool SubKey[2][16][48];// 16圈子密钥 static bool Is3DES;// 3次DES标志 static char Tmp[256], deskey[16];
4.2 VB编写Word插件
4.2.1建立Word插件工程
(1)创建“外接程序”工程,如图5:
图5 VB中新建工程图
第 11 页 共 20 页
(2) 打开“设计器”中的Connect设计器。双击该Connect的图标,如图6:
图6 工程项目图
修改其中的工程名和应用程序。其中,“应用程序”选择该插件是针对哪个具体的应用程序的。这里选Word。
(3)添加对Word类型库的引用,如图7
图7 工程引用图
系统缺省添加了对Office类型库的引用。但由于开发的是Word插件,因此需要存取Word中的对象。所有必须添加对Word的引用。
(4)打开该设计器的代码窗口。设计器的代码就是插件接口方法的实现。 1)删除系统缺省添加的代码。
系统缺省添加的代码是针对VB插件的,而不是Word或其它应用程序插件的。因此删除它们。
2)添加AddinInstance对象的OnConnection方法。AddinInstance就代表了该插件本身。
(5) 调试
设置该工程的属性,将“调试”中的启动程序设置为系统中安装的
第 12 页 共 20 页