请较高手:如何通过代码将OLEContainer中数据包(Package)中的文件保存到磁盘? (200分)

  • 主题发起人 主题发起人 jifee
  • 开始时间 开始时间
J

jifee

Unregistered / Unconfirmed
GUEST, unregistred user!
调用OLEContainer.CreateFromFile方法后,不支持OLE的文件会以数据包(Package)的形式保存在OLEContainer中。
通过激活“对象包装程序”可以将该文件保存到磁盘上;但是如何通过代码来实现这个过程!
通过OLEContainer.SaveAsDocument方法所保存的文件与原始文件有所不同,导致输出的文件无法使用;
某些文件(如:DOC、BMP等)可以通过某些措施实现文件的输出,问题在于是否具有通用的方法来实现该过程?
 
好像用流的方式可以
 
无论是采用SaveToStream、SaveToFile还是SaveAsDocument方法,OLEContainer都会在文件中插入大量的OLE数据,大多数类型的文件(doc,xls,rar等文件除外)因此将无法打开(文件大小会增加数K)。
但是通过“对象包装程序”进行保存就可以完全地还原原始文件,问题是我不知道“对象包装程序”对OLE数据包是如何进行处理的,我在代码中如何实现?
 
OLEContainer在头部加上了OLE的信息,你去掉他加上的信息后保存应该就可以了!
 
我无法获知OLEContainer所添加的OLE的信息位置和大小;虽有这方面的代码?
 
SaveAsDocument
 
不好意思,没有能够仔细看清题目

SaveToFile or SaveToStream or SaveAsDocument都是利用Compound Storage存储相关内容的
详细信息清查看关于OleSave的介绍,见下面摘录
用UltraEdit打开察看,在用OleCaotainer.SaveToFile保存的内容里
格式上比正常的CompoundFile多了12字节,应该是保存的该对象的CLSID吧,(没有校对)
之后的数据看起来就是ComponeFile,但在利用StgOpenStorage打开时报错
版本不同,也许应该要利用Ex函数吧,留待大家继续攻下去,呵呵


OleSave does the following:

Calls the IPersistStorage::GetClassID method to get the CLSID of the object.
Writes the CLSID to the storage object using the WriteClassStg function.
Calls the IPersistStorage::Save method to save the object.
If there were no errors on the save; calls the IStorage::Commit method to commit the changes.
Note [red]Static objects are saved into a stream called CONTENTS[/red]. Static metafile objects get saved in "placeable metafile format" and static DIB data gets saved in "DIB file format." These formats are defined to be the OLE standards for metafile and DIB. All data transferred using an IStream interface or a file (that is, via IDataObject::GetDataHere) must be in these formats. Also, all objects whose default file format is a metafile or DIB must write their data into a CONTENTS stream using these standard formats.


 
好像不只多了12字节,不同格式的文件有所不同。有些文件还不止在文件头加有内容,好像文件中部也有内容加入。实在琢磨不透!
 
type
TStHead = record
biaozhi : integer; // 标志,$434F4442
yangshi : integer; //样式,1
Size : integer; //文件大小
end;
 
什么意思?
能详细点吗!
 
后退
顶部