Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

Как создать экземпляр 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.128 c
14-1118892226
Магнум
2005-06-16 07:23
2005.07.18
Глеб Павловский


3-1118267577
highlander
2005-06-09 01:52
2005.07.18
Работа с БД Firebird, Interbase в Делфи


6-1113123235
Петя Иванов
2005-04-10 12:53
2005.07.18
загрузка страницы в браузере


1-1119954759
Ванечка
2005-06-28 14:32
2005.07.18
Галочка


3-1118133148
Separator
2005-06-07 12:32
2005.07.18
Сравнение баз данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский