Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
2-1326905228
Pcrepair
2012-01-18 20:47
2012.05.27
Удаление тегов из ХТМЛ-страницы


15-1327085063
Artem
2012-01-20 22:44
2012.05.27
Правильная компиляция при наличии только коротких переходов...


3-1275680538
AlpenLeo
2010-06-04 23:42
2012.05.27
добавление даты в поле таблицы


2-1327317793
Alex_C
2012-01-23 15:23
2012.05.27
TADOCommand - узнать последнюю добавленную запись


15-1327222812
Псарь
2012-01-22 13:00
2012.05.27
Торрент и интернет.