23.06.2018, 22:47 [+3 UTC]
в нашей команде: 2 855 чел. | участники онлайн: 1 (рекорд: 21)

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

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

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

:: правила

:: новости

:: участники

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

:: форум

:: блоги

:: поиск

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

:: наш журнал

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

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

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

:: поддержка

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

Версия системы:
7.47 (16.04.2018)

Общие новости:
13.04.2018, 10:33

Форум:
18.06.2018, 08:55

Последний вопрос:
23.06.2018, 07:43

Последний ответ:
23.06.2018, 18:27

Последняя рассылка:
23.06.2018, 22:15

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

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

Наша кнопка:

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

Отзывы о нас:
16.08.2009, 18:01 »
Semiotic
Спасибо все спецам за их отзывчивость по любому поводу, за их ангельское терпение к безграмотным, ленивым и тупым вопросителям!
24.11.2010, 14:42 »
Козловский Константин Викторович
Спасибо огромное очень сильно мне помогли! [вопрос № 180915, ответ № 264300]

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

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

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

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

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 273
Асмик Гаряка
Статус: Советник
Рейтинг: 24
mklokov
Статус: 6-й класс
Рейтинг: 23

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

Консультация онлайн # 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

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


Посетитель

ID: 217309

# 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

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

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


Посетитель

ID: 217309

# 4

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

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

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

ID: 425

# 5

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

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

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


Посетитель

ID: 217309

# 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.15947 сек.

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