VC实现Word/Excel文件数字签名

博主因工作繁忙无暇上论坛,针对网友提出的将密钥写入Word且不破坏文档的需求,给出思路:使用结构化文档COM组件生成结点写入密钥。文中给出了C语言实现写入和读取文档的代码,还提到结合此思路和文档数据可实现数字签名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Author:zfive5(zhaozidong)

Email :zfive5@yahoo.com.cn

 

/*

前些天工作很忙和累,加上bug,无心也不允许我上论坛,前些看到一个网友给我发的短消息,说是要实现密钥写到word里,同时不能破坏word!早些时候就知道word是结构化文档,所以我的思路就是用结构化文档接口生成一个结点,然后写上所谓的密钥!说白了只要会使用结构化文档com组件就ok了!

不说废话了,开编:)

*/

 

#include "stdafx.h"

#include "objidl.h"

#include "comdef.h"

long WriteDoc(char *szFileName,char *szName,char *szValue)

{

     IStorage *pStore=NULL;

     IStream  *pStream=NULL;

 

     HRESULT hr=E_FAIL;

     hr=::StgOpenStorage(_bstr_t(szFileName),NULL,STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE,NULL,0,&pStore);

     if(hr!=S_OK&&pStore==NULL)

     {

         return -1;

     }

 

     hr=pStore->CreateStream(_bstr_t(szName),STGM_READWRITE|STGM_CREATE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE,0,0,&pStream);

     if(hr!=S_OK)

     {

         pStore->Release();

         return -1;

     }

 

    ULONG uSize;

     hr=pStream->Write((void *)szValue,strlen(szValue)+1,&uSize);

     if(hr!=S_OK)

     {

         pStream->Release();

         pStore->Release();

         return -1;

     }

 

     pStream->Release();

     pStore->Release();

     return 0;

}

 

long ReadDoc(char *szFileName,char *szName,char *szValue,int nSize)

{

     IStorage *pStore=NULL;

     IStream  *pStream=NULL;

 

     HRESULT hr=E_FAIL;

     hr=::StgOpenStorage(_bstr_t(szFileName),NULL,STGM_READ|STGM_DIRECT|STGM_SHARE_EXCLUSIVE,NULL,0,&pStore);

     if(hr!=S_OK&&pStore==NULL)

     {

         return -1;

     }

 

     hr=pStore->OpenStream(_bstr_t(szName),NULL,STGM_READ|STGM_DIRECT|STGM_SHARE_EXCLUSIVE,0,&pStream);

     if(hr!=S_OK)

     {

         pStore->Release();

         return -1;

     }

 

     ULONG uSize;

     hr=pStream->Read(szValue,nSize,&uSize);

     if(hr!=S_OK)

     {

         pStream->Release();

         pStore->Release();

          return -1;

     }

 

     pStream->Release();

     pStore->Release();

     return 0;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

     ::CoInitialize(NULL);

     {

         char szBuf[100+2];

 

         WriteDoc("c://zfive5.doc","zfive5-6","hello");

         memset(szBuf,100,sizeof(szBuf));

         ReadDoc("c://zfive5.doc","zfive5-6",szBuf,sizeof(szBuf)-2);

         printf(szBuf);

     }

     ::CoUninitialize();

     return 0;

}

 

/*

 *  

 用这种思路,再结合文档数据结合起来就可以实现数字签名,至于用md5还是sha就随便了!

 */

 

1:

zfive5word 


1.引言   WORD电子签名插件,支持手写、本地电子图章、以及网络图章功能。软件使用VC6,以ATL方式编写,软件小巧精致。   这是我学习ATL的成果,学习过程及程序的编写,前前后后共用了一个多月的时间,花了不少的心血。其间遇到了不少困难,终于都一一解决了。这要感谢www.youkuaiyun.com上的热心朋友,从他们的BLOG文章中,我获得了不少灵感。现在这个软件基本完成了,全部实现了我自己定的设计需求,自己觉得这个软件还有一定的用处,就把它的测试版发布一下,希望使用者多提宝贵意见。 注:测试版没有任何的功能限制,只是“关于”对话框中显示测试版字样。 2.功能 可以完成手写签名及插入签章的功能。插入签名或签章后,可以监控WORD文档是否被修改。软件的使用界面很简单,只是在WORD里插入了一个工具栏,上面有三个按钮。其它的功能在插入的签名或签章上按右键根据弹出菜单选择执行。 印章支持多种格式图片,如BMP,JPG,GIF(静止的)等,使用时用印章管理工具把这些导入到印章库即可。 印章库管理密码:12345   几个内置的印章使用密码:111111 3.软件的使用:   使用windows系统带的控件注册工具regsvr32.exe,注册一下XXHSignature.dll即可;或者直接运行当前目录下的Register.exe,也可完成注册。这样打开word就可以看到签名工具栏。 软件包含以下几个文件: steal.mdb 印章库。 xxhsignature.ini 配制文件,如果没有会自动生成。 XXHSignature.dll WORD2003的COM加载项。程序的主体。 Register.exe 注册/卸载XXHSignature.dll用,可以不使用,直接使用regsvr32。 register.bat 注册的快捷方式,调用register.exe。纯属辅助,方便使用。 unregister.bat 卸载的快捷方式,带命令行参数调用register.exe。纯属辅助,方便使用。 StealManager.exe 印章管理工具。 说明文档.txt 说明文档。 软件使用VC6、ATL开发,没有使用MFC,所以每个软件都很小巧。 我在开发时使用的环境为XP、WORD2003,对软件在其它环境下没有进行过测试,不知道存不存在兼容问题。期待大家的反馈,可以给我发EMAIL,或者到我的博客留言。 如果程序运行有问题,可以使用Unregister.bat或regsvr32 /u将其卸载即可。也可以使用WORD的加载项管理菜单(该菜单默认时不显示,可以点击工具->自定义中找到使之显示),禁止插插件启动时运行。 另外:软件编译为UNICODE,对WIN98肯定是不支持。 欢迎转载,转载时请不要删除这些信息。谢谢。 2008-10-17 作者:wallimn email:wallimn@sohu.com QQ:54871876 博客:http://blog.youkuaiyun.com/wallimn
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值