2016-03-14 35 views
1

我想打開在Delphi 7中創建的tmp文件。我被告知它們是OLE文件,它可以包含任何從Word文檔到圖像。 這些文件被命名爲tmpdoc.tmp在Delphi 7中打開該文件: 使用OleCtnrs;在C#2012或以上版本中打開OLE文件,在Delphi 7中創建OLE文件

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; 

我認爲關鍵是OLECtnrs.pas內複製LoadFromFile和LoadfromStream在C#。

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

舊的.DOC文件格式是OLE文件,但新的.DOCX格式與OLE無關。 OpenMcdf可以使用舊的.DOC和.DOT文件,但不能與.DOCX文件一起使用。新的.DOCX文件實際上是一個包含Word文檔數據的zip文件。