Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-1128235140
Мазут Береговой
2005-10-02 10:39
2005.10.23
Старый добрый "Крокодил"


2-1127922780
Fl@sh
2005-09-28 19:53
2005.10.23
File+Save+..Массив класса??!!!!


2-1128067300
555
2005-09-30 12:01
2005.10.23
Почему то возникает ошибка - Stek Overlow


2-1128361516
Erl
2005-10-03 21:45
2005.10.23
Events у созданного программно компонента


4-1124699648
Drakosha
2005-08-22 12:34
2005.10.23
Кто использует файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский