Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TStream в/из Dll


Gu ©   (2012-01-19 23:06:00) 

Подскажите плз, нет ли каких особых моментов при передаче-получении потока (t/tmemory/tfile/tstring)stream в/из dll (без общего манагера памяти).
Можно ли передовать-получать как например const st:tStream; или var.. или var+длина потока. Или может быть новые методы есть (все про xe2), типа pbytes или еще чего. Или как поинтер.
Нашел несколько статей на эту тему, но часть устарела, а часть не очень понятно чем зканчивается в коментах (там про передачу tStream as IStream (типа как интерфейс, может не правильно написал)).
Какой сейчас метод актуальней и безболезненней с учетом "для разных языков  не только для дельфи exe"


Gu   (2012-01-20 12:42:00) [1]

спасибо


han_malign   (2012-01-20 09:52:00) [2]


> Дело в том, что TStream в Dll и TStream в основной программе это не одно и то же.
> Это два разных класса у которых по счастливому стечению обстоятельств совпадает название и методы.

- вообще - все базовые методы TStream - виртуальные(все остальные - по сути - хелперы), включая деструктор - который делегирует освобождение памяти экземпляра в контекст "правильного" менеджера памяти...
Но прокатит это только в случае совместимости библиотек приложения/DLL.(лучше - если они собираются в одном проекте, но в этом случае - не вижу необходимости разводить "DLL-ад", а если все таки зудит - правильнее использовать BPL)

Так что - IStream или прямой буфер/размер(в случае сериализации на лету можно callback) - таки, с точки зрения версионности, надежнее.


han_malign   (2012-01-20 09:18:00) [3]


> Для разных языков не только дельфи подойдёт только IStream

- звучит страшно, но с TStreamAdapter - использование элементарно...
try
  pass(TStreamAdapter.Create(stream, soReference) as IStream);
finally
  stream.free;
end;

либо
try
  stream_intf:= TStreamAdapter.Create(stream, soOwned) as IStream;
  stream:= nil;
  pass(stream_intf);
finally
  stream.free;
end;


> 1. Указатель на буффер
> 2. Размер буффера.

- TStream - не обязан быть фиксированным - это вполне может быть поток сериализованных(на лету) данных без ограничения по размерам.
Правда для этого уже надо перекрывать не входящие в контракт методы интерфейса IStream, чтобы они возвращали честное E_NOTIMPL, или - если посмотреть на реализацию TStreamAdapter - STG_E_INVALIDFUNCTION...


Ega23   (2012-01-20 08:18:00) [4]

2 параметра:
1. Указатель на буффер
2. Размер буффера.

Если предполагается, что он (размер) может измениться, то тогда оба как var.


Dimka Maslov   (2012-01-19 23:18:00) [5]

Для разных языков не только дельфи подойдёт только IStream


DVM   (2012-01-19 23:16:00) [6]

Указатель на экземпляр TStream нельзя передавать из/в DLL. Если попробовать это сделать, то оно скорее всего даже будет работать, но это все равно не правильно. Дело в том, что TStream в Dll и TStream в основной программе это не одно и то же. Это два разных класса у которых по счастливому стечению обстоятельств совпадает название и методы. Но собери Dll и программу в разных версиях Delphi и можем получить проблемы.

Передавать можно только указатель на буфер в памяти как я уже неоднократно говорил.


Наверх

Титульная страница Поиск, карта сайта Написать письмо