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。任何想法或指針都會受到歡迎。