18.12.2018, 17:22 [+3 UTC]
в нашей команде: 3 244 чел. | участники онлайн: 19 (рекорд: 19)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.59 (18.12.2018)

Общие новости:
18.12.2018, 00:02

Форум:
18.12.2018, 14:33

Последний вопрос:
18.12.2018, 16:31

Последний ответ:
18.12.2018, 14:01

Последняя рассылка:
18.12.2018, 17:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
20.12.2011, 12:33 »
starlet
Спасибо огромное!!!! [вопрос № 184808, ответ № 269223]
23.02.2010, 22:24 »
D1ver
Спасибо большое, как всегда Вы отлично работаете. [вопрос № 176857, ответ № 259688]

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 830
puporev
Статус: Профессионал
Рейтинг: 82
Степанов Иван /REDDS
Статус: 4-й класс
Рейтинг: 26

Перейти к консультации №:
 

Консультация онлайн # 140905
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: User_X3
Отправлена: 28.07.2008, 17:19
Поступило ответов: 0

Здравствуйте, уважаемые эксперты!
Имеется некоторая функция
---
function FRPROC(buffer: Pointer; length: cardinal; user: Pointer): cardinal; stdcall;
begin

end;

---
где необходимо в переменную buffer скопировать length байтов, а возвращаемое значение - количество скопированнх байт.

Имеется поток
...
var mem:TMemoryStream;
...
в котором есть некоторые данные.

Вопрос: Как скопировать из пременной mem в переменную buffer данные?
----
У меня почему-то ошибка при использовании: result:=mem.Read(buffer^,length);

Заранее благодарен!

Исправлены теги.
--------

• Отредактировал: Admiral (Мастер-Эксперт)
• Дата редактирования: 28.07.2008, 17:56

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 140905

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 1

= общий = | 28.07.2008, 17:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

User_X3

Встречные вопросы:
1. Выделена ли у Вас память под переменную buffer?
2. Достаточно ли выделено памяти, чтобы влезло всё то, что Вы пытаетесь туда впихнуть?
3. Самый главный вопрос: А ошибка то какая выскакивает? Или это секрет? smile

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

# 2

= общий = | 28.07.2008, 18:38

Эта функция вызывается из динамической библиотеки.
Доказательством того, что памяти хватает являетсо это:
....
var f:THandle;
begin
mem.SaveToFile('C: mp');
f:=fileopen('C: mp',GENERIC_READ);
result:=fileread(f,buffer,length);
fileclose(f);
end;
...
Правда, после 3 проходов все дело при отлаживании встает и появляется окно процессора, где происходит хз что.
А насчет ошибки, я имел ввиду переход из библиотеки к другой функции, указывающей о завершении процесса считывания. То есть чтение было прервано или там еще хз что произошло.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 3

= общий = | 28.07.2008, 19:10 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

User_X3

Боюсь, что с такими пояснениями ответа на свой вопрос Вы будете ждать долго...

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

# 4

= общий = | 28.07.2008, 19:32

угу, что ж поделаешь ((

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 5

= общий = | 29.07.2008, 05:27 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

"А насчет ошибки, я имел ввиду переход из библиотеки к другой функции, указывающей о завершении процесса считывания."
Единственное, чем Вы можете руководствоваться, что процесс считывания прошёл благополучно в функциях наподобие TStream.Read() - это количество прочитанных байт. Если оно совпадает с тем, что Вы задали, значит всё прочитано правильно, если количество равно нулю, то то чтения не произошло вовсе, если количество меньше заданного, значит Вы дошли до конца файла, что можно проверить дополнительно посмотрев TStream.Position которое, в этом случае, должно равнятся TStream.Size.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

# 6

= общий = | 29.07.2008, 17:50

После "напрасных телодвижений" smile ничего не остается как ответит на свой вопрос:

Правильный вариант функции:

function FRPROC(buffer: Pointer; length: cardinal; user: Pointer): cardinal; stdcall;
begin
copymemory(buffer,mem.Memory,length);
result:=length;
end;


Все гораздо проще smile

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.22424 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.59 от 18.12.2018