在C#2012或更高版本中打开OLE文件,OLE文件是在Delphi 7中创建的

时间:2016-03-14 04:35:58

标签: c# delphi com ole

我正在尝试打开在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的善良人士。任何想法或指针都是最受欢迎的。

1 个答案:

答案 0 :(得分:0)

旧的.DOC fileformat是一个OLE文件,但新的.DOCX格式与OLE无关。 OpenMcdf将使用旧的.DOC和.DOT文件,但不能使用.DOCX文件。新的.DOCX文件实际上是一个包含Word文档数据的zip文件。