Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
6-1120485932
matroskin
2005-07-04 18:05
2005.10.23
Как посылать SYN пакеты???


3-1126179730
Angel[Saint]
2005-09-08 15:42
2005.10.23
ADOTable1.LoadFromFile не сохраняет данные в БД


3-1126530501
naz
2005-09-12 17:08
2005.10.23
Temporary table


14-1127915520
Juice
2005-09-28 17:52
2005.10.23
COM+Delphi="Гнилая" тема?


14-1128316205
Ega23
2005-10-03 09:10
2005.10.23
С днем рождения! 1 октября