Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1327265150
Чайник
2012-01-23 00:45
2012.05.27
Можно ли добавить в стандартный диалог..


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


15-1326966363
palva
2012-01-19 13:46
2012.05.27
Современный Оруэлл


15-1326438236
Омлет
2012-01-13 11:03
2012.05.27
Танк по асфальту


15-1326651004
Petr V. Abramov
2012-01-15 22:10
2012.05.27
вопрос полиглотам :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский