Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как загрузить данные из интерфейса IStream в объект TMemoryStream в Delphi

Delphi , Технологии , ActiveX

Вопрос, стоящий перед разработчиками, работающими с технологиями COM в среде Delphi, часто связан с необходимостью работы с интерфейсом IStream. В частности, может возникнуть задача загрузки данных из IStream в объект TMemoryStream, который является стандартным классом для работы со потоками в Delphi.

Описание проблемы

Интерфейс IStream используется в COM для представления потока данных, который может быть как последовательным чтением, так и записью. В Delphi для работы с потоками используется класс TStream, который является базовым классом для различных операций с данными. Задача состоит в том, чтобы использовать объект TComInterface<IStream> для чтения данных в TMemoryStream.

Варианты решения

Первый способ: чтение данных в буфер

Один из способов - это чтение данных из IStream в буфер, который затем можно записать в TMemoryStream. Для этого необходимо определить размер данных в IStream, прочитать их в буфер и записать в TMemoryStream. Пример кода на Object Pascal, который демонстрирует этот процесс:

TComInterface<IStream> pIStrm;
TMemoryStream *pMStrm;

...

STATSTG stat = {0};
OleCheck(pIStrm->Stat(&stat, STATFLAG_NONAME));

LARGE_INTEGER li;
li.QuadPart = 0;
ULARGE_INTEGER ul;
OleCheck(pIStrm->Seek(li, STREAM_SEEK_CUR, &ul));
unsigned __int64 ulPos = ul.QuadPart;

BYTE buffer[1024];
while (ulPos < stat.cbSize.QuadPart)
{
    ULONG ulRead;
    OleCheck(pIStrm->Read(buffer, Min(stat.cbSize.QuadPart - ulPos, sizeof(buffer)), &ulRead));
    pMStrm->WriteBuffer(buffer, ulRead);
    ulPos += ulRead;
}

Второй способ: создание обертки для IStream

Второй способ заключается в создании класса TIStreamWrapper, который наследуется от TStream и предоставляет доступ к данным IStream. Это позволяет использовать объект IStream как TStream для вызова методов, таких как LoadFromStream или CopyFrom. В приведенном ниже примере кода реализован класс TIStreamWrapper:

class TIStreamWrapper : public TStream
{
private:
    TComInterface<IStream> pIStrm;

protected:
    virtual __int64 __fastcall GetSize();
    virtual void __fastcall SetSize(const __int64 NewSize);

public:
    __fastcall TIStreamWrapper(IStream *Strm);
    virtual int __fastcall Read(void *Buffer, int Count);
    virtual int __fastcall Write(const void *Buffer, int Count);
    virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin);
    // ... реализация остальных методов ...
};

__fastcall TIStreamWrapper::TIStreamWrapper(IStream *Strm)
    : pIStrm(Strm, true)
{
}

__int64 __fastcall TIStreamWrapper::GetSize()
{
    STATSTG stat = {0};
    OleCheck(pIStrm->Stat(&stat, STATFLAG_NONAME));
    return stat.cbSize.QuadPart;
}

// ... реализация остальных методов ...

// Использование обертки для загрузки данных в TMemoryStream
TComInterface<IStream> pIStrm;
TMemoryStream *pMStrm;
TIStreamWrapper *pWrapper = new TIStreamWrapper(pIStrm);
try
{
    pMStrm->LoadFromStream(pWrapper);
    // или: pMStrm->CopyFrom(pWrapper, 0);
}
__finally
{
    delete pWrapper;
}

Подтвержденное решение

Код, приведенный выше, демонстрирует два подхода к решению задачи: чтение данных из IStream непосредственно в буфер и последующую запись в TMemoryStream, а также создание обертки TIStreamWrapper, позволяющей использовать IStream как TStream для вызова стандартных методов работы с потоками в Delphi.

Заключение

Работа с интерфейсом IStream в Delphi может быть неочевидной, но с помощью приведенных выше примеров кода разработчики могут легко интегрировать данные из IStream в свои проекты, используя TMemoryStream. Это позволяет использовать широкий спектр функций для обработки данных, предоставляемых классом TMemoryStream.

Создано по материалам из источника по ссылке.

Задача заключается в том, чтобы перенести данные из интерфейса IStream в объект TMemoryStream в среде разработки Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ActiveX ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:10:47/0.0034749507904053/0