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

Вниз

Как создать экземпляр TOleStream?   Найти похожие ветки 

 
AlexG ©   (2005-06-27 10:40) [0]

Не могу понять как создать экземпляр TOleStream. В конструкторе нужно передать ссылку на интерфейс IStream, но где его взять? Если вставлять просто Stream, то компилятор ругается на несовместимость типов IStream и TStream. Кто-нибудь может помочь примером?


 
Digitman ©   (2005-06-27 10:45) [1]


> В конструкторе нужно передать ссылку на интерфейс IStream,
> но где его взять?


MyOleStream := TOlestream.Create(SomeOleObject as IStream);

где SomeOleObject - это некий существующий олей-объект, реализующий интерфейс IStream


 
AlexG ©   (2005-06-27 11:12) [2]

где SomeOleObject - это некий существующий олей-объект, реализующий интерфейс IStream
В этом-то  вся и проблема. Какой объект может реализовывать интерфейс IStream?


 
Digitman ©   (2005-06-27 11:35) [3]


> Какой объект может реализовывать интерфейс IStream?


да мало ли какой ...

твой собственный, например ..


 
wal ©   (2005-06-27 11:36) [4]


> [2] AlexG ©   (27.06.05 11:12)
> В этом-то  вся и проблема. Какой объект может реализовывать
> интерфейс IStream?

Какой напишешь, такой и будет. TOleStream в принципе "не знает", что это за объект. Он "знает" только, что этот объект реализует некоторый функционал (методы, свойства), описанный в IStream. Что реально этот объект делать будет, TOleStream тоже "не знает", а только "предполагает", причем весьма абстрагированно. А реальные действия этот объект должен делать сам. Какие? Это тебя надо спросить, что ты от OleStream"а хотел.

С уважением.


 
AlexG ©   (2005-06-27 11:39) [5]

COM-объект из OleContainer сохранить хочу...


 
Digitman ©   (2005-06-27 11:43) [6]


> COM-объект из OleContainer сохранить хочу


и ?


 
AlexG ©   (2005-06-27 11:45) [7]

В общем, я пошел путем использования TMemoryStream


 
Digitman ©   (2005-06-27 11:49) [8]


> В общем, я пошел путем использования TMemoryStream


в общем ты не разобрался.
и имеешь все шансы на "грабли" в будущем.


 
AlexG ©   (2005-06-27 11:54) [9]

Я понял, что в качестве объекта с интерфейсом IStream можно использовать любой. И этот любой могу создать и я сам. И как я напишу, то он и будет делать. Но есть одно НО: я же не знаю заранее какой объект будет у меня в OleContainer. Хотел услышать какие-то стандартные идентификаторы, имена...


 
Digitman ©   (2005-06-27 11:57) [10]


> Хотел услышать какие-то стандартные идентификаторы, имена...


Майкрософт как раз и предлагает тебе такой "стандарт" ... в виде IStream .. и ты волен придерживаться или не придерживаться этого "стандарта"


 
Ломброзо ©   (2005-06-27 12:26) [11]

AlexG ©   (27.06.05 11:54)
Я понял, что в качестве объекта с интерфейсом IStream можно использовать любой. И этот любой могу создать и я сам. И как я напишу, то он и будет делать. Но есть одно НО: я же не знаю заранее какой объект будет у меня в OleContainer. Хотел услышать какие-то стандартные идентификаторы, имена...


Реализация контейнера такова, что ему по барабану, что в нем содержится и как оно там сохраняется. Мне навскидку известны два COM-класса, имплементирующие IStream - MSXML2.DomDocument и ADODB.Stream. Экспериментировать лень, но думаю, вполне можно загрузить в конейнер Документ MS Word, создать и инициализировать ADODB.Stream, связав его с файлом на диске, и записать документ в поток посредством OleКОнтейнера.


 
just_me   (2005-06-27 13:46) [12]

Попробуй поюзать класс TStreamAdapter.
Или вот пример создания IStream "на файле":

function GetOnFile(fName : string): IStream;
var
 grfMode : DWORD;
 pStream : IStream;
 dt      : pointer;
 stat : TStatStg;
 iSize : DWORD;
 hr    : HRESULT;
begin  Result := nil;
 grfMode := STGM_READ;// STGM_WRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE;
 hr := (SHCreateStreamOnFile(PChar(fName), grfMode, pStream));
 if S_OK = hr then
 begin
   hr := pStream.Stat(stat, STATFLAG_NONAME);
   iSize := stat.cbSize;
   try
     GetMem(dt, nBuffSize);
     hr := pStream.Write(dt, iSize, @iSize);

     if (S_OK = hr) or (S_FALSE = hr)  then
       Result := pStream;
   finally
     FreeMem(dt, nBuffSize);
   end;
 end
 else
   // error
end;
Можно прмиерно аналогично построить IStream на основе содержимого памяти, тогда используется вызов CreateStreamOnHGlobal



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.068 c
3-1118127607
td
2005-06-07 11:00
2005.07.18
Пароль при подключении к Ораклу


1-1120132800
net_daemon
2005-06-30 16:00
2005.07.18
Обработка удаления в RichEdit e


1-1119782265
Lamer blin
2005-06-26 14:37
2005.07.18
Word Aplication


4-1116872927
alex-drob
2005-05-23 22:28
2005.07.18
Проверка SetWindowsHookEx


6-1113230691
LXD
2005-04-11 18:44
2005.07.18
Indy передача данных по сети...