Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизOleConvertIStorageToOLEStream Найти похожие ветки
← →
Digitman © (2005-09-30 16:19) [0]Кто-нибудь исследовал на практике вопросы использования этой ф-ции ?
Интересует возможность ее использования в целях сохранения указанного хранилища в ole1-потоке с целью дальнейшей загрузки olecontainer"а из этого потока ... т.е. минуя промежуточное сохранение хранилища в файл ..
← →
Digitman © (2005-09-30 17:37) [1]Скажем, имеется xls-файл, в содержимое соотв.документа внедрен Word-документ
Идея проста: открыть xls-файл как Storage (RootStorage), открыть в нем дочерний Storage, соответствующий внедренному док-ту, сохранить открытый дочерний Storage в IStream-объект, загрузить этот стрим в TOleStream и открыть документ вызовом TOleContainer.LoadFromStream(OleStream)
Преимущество очевидно : минуем стадию сохранения дочернего Storage в файл ..
← →
Набережных С. © (2005-10-01 09:08) [2]По-моему, OleConvertIStorageToOLEStream - не совсем то, хотя я особо в нее не вникал.
Загрузить внедренный документ можно иначе:
procedure LoadContainedDocument(const FileName, DocName: WideString;
const OleContainer: TOleContainer);
var
Root, Doc: IScrStorage;
TempStg: IStorage;
LB: ILockBytes;
MS: TMemoryStream;
H: HGlobal;
pBuf: Pointer;
Header: TStreamHeader;
begin
OleCheck(CreateILockBytesOnHGlobal(0, true, LB));
OleCheck(StgCreateDocfileOnILockBytes(LB, STGM_CREATE or STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, 0, TempStg));
Root:=CreateStorage(FileName);
Root.GetStorage(DocName, Doc);
OleCheck((Doc as IStorage).CopyTo(0, nil, nil, TempStg));
OleCheck(TempStg.Commit(STGC_DEFAULT));
OleCheck(GetHGlobalFromILockBytes(LB, H));
MS:=TMemoryStream.Create;
try
with Header do
begin
Signature:=StreamSignature;
DrawAspect:=DVASPECT_CONTENT;
DataSize:=GlobalSize(H);
end;
MS.Write(Header, SizeOf(Header));
pBuf:=GlobalLock(H);
try
MS.WriteBuffer(pBuf^, Header.DataSize);
finally
GlobalUnlock(H);
end;
MS.Position:=0;
OleContainer.LoadFromStream(MS);
finally
MS.Free;
end;
end;
Использовать так:
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadContainedDocument("Example.xls", "MBD000C3BCC", OleContainer1);
OleContainer1.DoVerb(ovShow);
end;
← →
Набережных С. © (2005-10-01 09:09) [3]Да, здесь использован модуль StorageObject, он есть в кладовке, в файле Storage.zip. Хотя и без него вполне можно переделать.
← →
Набережных С. © (2005-10-01 09:41) [4]Еще одно забыл:)
TStreamHeader и StreamSignature выдернуты из файла OleCtnrs.pas:
type
TStreamHeader = record
case Integer of
0: ( { New }
Signature: Integer;
DrawAspect: Integer;
DataSize: Integer);
1: ( { Old }
PartRect: TSmallRect);
end;
const
StreamSignature = $434F4442; {"BDOC"}
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c