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: