Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как IStream перегнать в TMemoryStream? 
V
    Опции темы
Alca
Дата 25.6.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Как IStream перегнать в TMemoryStream?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 25.6.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Создать дополнительный TStreamAdapter, который реализует IStream используя любой TStream.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alca
Дата 25.6.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



а по-русски?  smile 

Это сообщение отредактировал(а) Alca - 25.6.2010, 11:58


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 25.6.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



TStreamAdapter в конструкторе принимает указатель на любой объект наследник от TStream, коим является TStreamAdapter. Второй параметр определяет будет ли объект TStreamAdapter владеть переданным ему объектом (т.е. будет ответственным за его удаление). Я бы рекомендовал именно владение.

Код

DelphiInterface<IStream> IStr = new TStreamAdapter(new TMemoryStream, soOwned);


Теперь все действия производимые с IStr реально будут производиться с TMemoryStream.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 25.6.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Упс наврал.
Вот рабочий пример
Код

   DelphiInterface<IStream> IStr;
    (new TStreamAdapter(new TMemoryStream, soOwned))->QueryInterface(__uuidof(IStream), &IStr);
    int c = 5, d = 4;
    IStr->Write(&c, 4, NULL);
    IStr->Seek(LARGE_INTEGER(), STREAM_SEEK_SET, NULL);
    IStr->Read(&d, 4, NULL);




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alca
Дата 25.6.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



а что делать с new, Как освобождать память?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 25.6.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



По идее QueryInterface увеличит счетчик ссылок, а DelphiInterface при выходе за область видимости уменьшит счетчик ссылок на единицу, после чего TStreamAdapter должен самоуничтожиться и убить TMemoryStream.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alca
Дата 25.6.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Криво, косо, но работает:
Код

BOOL bIStreamToMemoryStream(IStream *pisStream, TMemoryStream **ppmsStream) {
    /*DEBUG*/// _m_imgImage
    /*DEBUG*/xASSERT_RET(NULL !=  pisStream,  FALSE); 
    /*DEBUG*/xASSERT_RET(NULL !=  ppmsStream, FALSE);
    /*DEBUG*/xASSERT_RET(NULL != *ppmsStream, FALSE);

    HRESULT hRes = 0;

    //-------------------------------------
    //устанока размера потока ppmsStream
    STATSTG   stStat = {0};
    ULONGLONG ulSize = 0;

    hRes = pisStream->Stat(&stStat, 0);
    /*DEBUG*/xASSERT_RET(S_OK == hRes, FALSE);
    
    ulSize = stStat.cbSize.QuadPart;
    
    (*ppmsStream)->SetSize((int)ulSize);
    /*DEBUG*/// n/a
    
    //-------------------------------------
    //чтение в поток
    hRes = pisStream->Seek(LARGE_INTEGER(), STREAM_SEEK_SET, NULL);
    /*DEBUG*/xASSERT_RET(S_OK   == hRes, FALSE);
    
    ULONG ulReaded = 0;
    hRes = pisStream->Read((*ppmsStream)->Memory, ulSize, &ulReaded);
    /*DEBUG*/xASSERT_RET(S_OK   == hRes,     FALSE);
    /*DEBUG*/xASSERT_RET(ulSize == ulReaded, FALSE);

    return TRUE;
}


Alexeis, спасибо

Это сообщение отредактировал(а) Alca - 25.6.2010, 15:39


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.