![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 и можем получить проблемы.
Передавать можно только указатель на буфер в памяти как я уже неоднократно говорил.