Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];
ВнизTStream в/из Dll Найти похожие ветки
← →
Gu (2012-01-19 23:06) [0]Подскажите плз, нет ли каких особых моментов при передаче-получении потока (t/tmemory/tfile/tstring)stream в/из dll (без общего манагера памяти).
Можно ли передовать-получать как например const st:tStream; или var.. или var+длина потока. Или может быть новые методы есть (все про xe2), типа pbytes или еще чего. Или как поинтер.
Нашел несколько статей на эту тему, но часть устарела, а часть не очень понятно чем зканчивается в коментах (там про передачу tStream as IStream (типа как интерфейс, может не правильно написал)).
Какой сейчас метод актуальней и безболезненней с учетом "для разных языков не только для дельфи exe"
← →
DVM © (2012-01-19 23:16) [1]Указатель на экземпляр TStream нельзя передавать из/в DLL. Если попробовать это сделать, то оно скорее всего даже будет работать, но это все равно не правильно. Дело в том, что TStream в Dll и TStream в основной программе это не одно и то же. Это два разных класса у которых по счастливому стечению обстоятельств совпадает название и методы. Но собери Dll и программу в разных версиях Delphi и можем получить проблемы.
Передавать можно только указатель на буфер в памяти как я уже неоднократно говорил.
← →
Dimka Maslov © (2012-01-19 23:18) [2]Для разных языков не только дельфи подойдёт только IStream
← →
Ega23 © (2012-01-20 08:18) [3]2 параметра:
1. Указатель на буффер
2. Размер буффера.
Если предполагается, что он (размер) может измениться, то тогда оба как var.
← →
han_malign (2012-01-20 09:18) [4]
> Для разных языков не только дельфи подойдёт только 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...
← →
han_malign (2012-01-20 09:52) [5]
> Дело в том, что TStream в Dll и TStream в основной программе это не одно и то же.
> Это два разных класса у которых по счастливому стечению обстоятельств совпадает название и методы.
- вообще - все базовые методы TStream - виртуальные(все остальные - по сути - хелперы), включая деструктор - который делегирует освобождение памяти экземпляра в контекст "правильного" менеджера памяти...
Но прокатит это только в случае совместимости библиотек приложения/DLL.(лучше - если они собираются в одном проекте, но в этом случае - не вижу необходимости разводить "DLL-ад", а если все таки зудит - правильнее использовать BPL)
Так что - IStream или прямой буфер/размер(в случае сериализации на лету можно callback) - таки, с точки зрения версионности, надежнее.
← →
Gu (2012-01-20 12:42) [6]спасибо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c