Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2009, 19:44   #1
skymaster
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию не работает IStream::Read в delphi

не могу понять, как прочесть нужное количество байт из стрима...
skymaster вне форума Ответить с цитированием
Старый 28.05.2009, 20:14   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Stream.Read (Buffer, Count)
Вы не пробовали в штатном хэлпе поискать по слову IStream ?
Там все методы описаны и расписаны...
mihali4 вне форума Ответить с цитированием
Старый 28.05.2009, 21:08   #3
skymaster
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

и мсдн смотрел... какого типа buffer должен быть и как потом из него вытащить данные?
skymaster вне форума Ответить с цитированием
Старый 28.05.2009, 21:12   #4
skymaster
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

OleCheck (Stg.OpenStream ('f',nil,STGM_READWRITE
or STGM_SHARE_EXCLUSIVE,0,Strm));
Strm.Read(Ptr, 54);

пишет что не хватает параметров...
skymaster вне форума Ответить с цитированием
Старый 28.05.2009, 21:13   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

например
Код:
var i:byte;
----------
Stream.read(i,1);
прочтет один байт в переменную i.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.05.2009, 21:29   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от skymaster Посмотреть сообщение
и мсдн смотрел... какого типа buffer должен быть и как потом из него вытащить данные?
При чем тут мсдн?
Вот ответ из штатного дельфийского хэлпа:
Цитата:
Read method (ISequentialStream)
Reads a specified number of bytes from the current position in the stream.

Delphi syntax:

function Read(pv: Pointer; cb: Longint; pcbRead: PLongint): HResult; virtual; stdcall;

C++ syntax:

virtual HRESULT STDMETHODCALLTYPE Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead) = 0;

Description

Read reads up to cb bytes from the current position in the stream into the buffer to which pv points and updates the current position to the end of the bytes that were read.

pv is the buffer into which to read the bytes.

cb is the maximum number of bytes to read.

pcbRead returns the number of bytes that were actually read. This value will be less than or equal to cb.

Read returns S_OK if it successfully reads pcbRead bytes into the buffer. It returns STG_E_INVALIDPOINTER it can’t read because pv is nil (Delphi) or NULL (C++). It returns S_FALSE if the read operation fails for any other reason.
По-моему, отчетливее некуда.
Все типы прописаны, назначение их тоже...
mihali4 вне форума Ответить с цитированием
Старый 28.05.2009, 21:44   #7
skymaster
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

void __RPC_FAR *pv это в паскале как объявить?
и как из него потом данные достать?
прошу прощения за тупость... плохо дружу с паскалем
skymaster вне форума Ответить с цитированием
Старый 29.05.2009, 07:04   #8
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
void __RPC_FAR *pv это в паскале как объявить?
Pointer

Цитата:
Strm.Read(Ptr, 54);

пишет что не хватает параметров...
Цитата:
pv is the buffer into which to read the bytes.

cb is the maximum number of bytes to read.

pcbRead returns the number of bytes that were actually read. This value will be less than or equal to cb.
pv - указатель на буфер с данными (Pointer)
cb - длина буфера (Longint)
pcbRead - указатель на буфер типа Longint, ктрый будет содержать, в результате выполнения, кол-во успешно прочитанных байт (^Longint)

в твоем случае так:

Код:
var
  tmpSize : PLongint;
begin
...Strm.Read(Ptr, 54, tmpSize);

Последний раз редактировалось Ring0Sn; 29.05.2009 в 07:12.
Ring0Sn вне форума Ответить с цитированием
Старый 29.05.2009, 09:19   #9
skymaster
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

после выполнения Ptr = nil
...
skymaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
the cursor is read only Veroonya SQL, базы данных 2 19.03.2009 17:55
Чем различаются функции чтения класса istream C++ Go6a Помощь студентам 3 25.04.2008 11:04