Главная страница
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.01 c
2-1327500695
jacksotnik
2012-01-25 18:11
2012.05.27
Помогите с деструктором


15-1327042259
OW
2012-01-20 10:50
2012.05.27
Придумал как повысить производительность труда :)


2-1327321388
jiura
2012-01-23 16:23
2012.05.27
Как определить тип данных (число текст, дата) в переменной*


9-1191912113
bioSerg
2007-10-09 10:41
2012.05.27
Возникла проблема с Direct3d на новых карточках ATI x2000


15-1326968288
Sergey Masloff
2012-01-19 14:18
2012.05.27
Атомную подлодку "Гепард" спасла от пожара система ЛОХ