![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать экземпляр TOleStream? [D7, WinXP]
AlexG © (2005-06-27 10:40:00)Не могу понять как создать экземпляр TOleStream. В конструкторе нужно передать ссылку на интерфейс IStream, но где его взять? Если вставлять просто Stream, то компилятор ругается на несовместимость типов IStream и TStream. Кто-нибудь может помочь примером?
just_me (2005-06-27 13:46:00) [1]Попробуй поюзать класс 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
Ломброзо (2005-06-27 12:26:00) [2]AlexG © (27.06.05 11:54)
Я понял, что в качестве объекта с интерфейсом IStream можно использовать любой. И этот любой могу создать и я сам. И как я напишу, то он и будет делать. Но есть одно НО: я же не знаю заранее какой объект будет у меня в OleContainer. Хотел услышать какие-то стандартные идентификаторы, имена...
Реализация контейнера такова, что ему по барабану, что в нем содержится и как оно там сохраняется. Мне навскидку известны два COM-класса, имплементирующие IStream - MSXML2.DomDocument и ADODB.Stream. Экспериментировать лень, но думаю, вполне можно загрузить в конейнер Документ MS Word, создать и инициализировать ADODB.Stream, связав его с файлом на диске, и записать документ в поток посредством OleКОнтейнера.
Digitman (2005-06-27 11:57:00) [3]
> Хотел услышать какие-то стандартные идентификаторы, имена...
Майкрософт как раз и предлагает тебе такой "стандарт" ... в виде IStream .. и ты волен придерживаться или не придерживаться этого "стандарта"
AlexG (2005-06-27 11:54:00) [4]Я понял, что в качестве объекта с интерфейсом IStream можно использовать любой. И этот любой могу создать и я сам. И как я напишу, то он и будет делать. Но есть одно НО: я же не знаю заранее какой объект будет у меня в OleContainer. Хотел услышать какие-то стандартные идентификаторы, имена...
Digitman (2005-06-27 11:49:00) [5]
> В общем, я пошел путем использования TMemoryStream
в общем ты не разобрался.
и имеешь все шансы на "грабли" в будущем.
AlexG (2005-06-27 11:45:00) [6]В общем, я пошел путем использования TMemoryStream
Digitman (2005-06-27 11:43:00) [7]
> COM-объект из OleContainer сохранить хочу
и ?
AlexG (2005-06-27 11:39:00) [8]COM-объект из OleContainer сохранить хочу...
wal (2005-06-27 11:36:00) [9]
> [2] AlexG © (27.06.05 11:12)
> В этом-то вся и проблема. Какой объект может реализовывать
> интерфейс IStream?
Какой напишешь, такой и будет. TOleStream в принципе "не знает", что это за объект. Он "знает" только, что этот объект реализует некоторый функционал (методы, свойства), описанный в IStream. Что реально этот объект делать будет, TOleStream тоже "не знает", а только "предполагает", причем весьма абстрагированно. А реальные действия этот объект должен делать сам. Какие? Это тебя надо спросить, что ты от OleStream'а хотел.
С уважением.
Digitman (2005-06-27 11:35:00) [10]
> Какой объект может реализовывать интерфейс IStream?
да мало ли какой ...
твой собственный, например ..
AlexG (2005-06-27 11:12:00) [11]где SomeOleObject - это некий существующий олей-объект, реализующий интерфейс IStream
В этом-то вся и проблема. Какой объект может реализовывать интерфейс IStream?
Digitman (2005-06-27 10:45:00) [12]
> В конструкторе нужно передать ссылку на интерфейс IStream,
> но где его взять?
MyOleStream := TOlestream.Create(SomeOleObject as IStream);
где SomeOleObject - это некий существующий олей-объект, реализующий интерфейс IStream