我正在尝试打开在Delphi 7中创建的tmp文件。我被告知它们是OLE文件,可以包含从Word文档到图像的任何内容。 这些文件命名为tmpdoc.tmp要在Delphi 7中打开所述文件: 使用OleCtnrs;
OleContainer:TOleContainer;
OleContainer.LoadFromFile(sTmpDocFolder+TMP_DOC_FILENAME);
try
sOleStr := OleContainer.OleClassName;
bWord := (Pos('WORD.DOC',Uppercase(sOleStr)) > 0) or
(Right(Uppercase(sOleStr),4)='.DOT') or
(Right(Uppercase(sOleStr),4)='.DOC') or
(Right(Uppercase(sOleStr),5)='.DOCX'); // Word 2007
if bWord then begin
if (Right(Uppercase(sOleStr),5)='.DOCX') or ( Pos('Word.Document.12', sOleStr)>0) then sExportFilePath := sExportFilePath + '.docx'
else sExportFilePath := sExportFilePath + '.doc';
OleContainer.DoVerb(ovOpen);
OleContainer.OleObject.application.ActiveDocument.SaveAs(sExportFilePath);
SysUtils.DeleteFile(sTmpDocFolder+TMP_DOC_FILENAME);
end;
Result := True;
SysUtils.DeleteFile(sTmpDocFolder+TMP_DOC_FILENAME);
except
end;
我认为Key在OLECtnrs.pas中,并在C#中复制LoadFromFile和LoadfromStream。
procedure TOleContainer.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TOleContainer.LoadFromStream(Stream: TStream);
var
DataHandle: HGlobal;
Buffer: Pointer;
Header: TStreamHeader;
begin
DestroyObject;
Stream.ReadBuffer(Header, SizeOf(Header));
if (Header.Signature <> StreamSignature) and not FOldStreamFormat then
raise EOleError.CreateRes(@SInvalidStreamFormat);
DataHandle := GlobalAlloc(GMEM_MOVEABLE, Header.DataSize);
if DataHandle = 0 then OutOfMemoryError;
try
Buffer := GlobalLock(DataHandle);
try
Stream.Read(Buffer^, Header.DataSize);
finally
GlobalUnlock(DataHandle);
end;
OleCheck(CreateILockBytesOnHGlobal(DataHandle, True, FLockBytes));
DataHandle := 0;
OleCheck(StgOpenStorageOnILockBytes(FLockBytes, nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, nil, 0, FStorage));
OleCheck(OleLoad(FStorage, IOleObject, Self, FOleObject));
FDrawAspect := Header.DrawAspect;
InitObject;
UpdateView;
except
if DataHandle <> 0 then GlobalFree(DataHandle);
DestroyObject;
raise;
end;
end;
我已经研究了一段时间了。我最终找到了OpenMcdf 2.0。我以为这会打开文件。但是,由于我认为标题不同,我没有感到高兴。
请帮助Stackoverflow的善良人士。任何想法或指针都是最受欢迎的。
答案 0 :(得分:0)
旧的.DOC fileformat是一个OLE文件,但新的.DOCX格式与OLE无关。 OpenMcdf将使用旧的.DOC和.DOT文件,但不能使用.DOCX文件。新的.DOCX文件实际上是一个包含Word文档数据的zip文件。