Консультация № 140905
28.07.2008, 17:19
0.00 руб.
28.07.2008, 17:56
0 6 0
Здравствуйте, уважаемые эксперты!
Имеется некоторая функция
---
[font=Tahoma]function FRPROC(buffer: Pointer; length: cardinal; user: Pointer): cardinal; stdcall;
begin

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

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

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

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

Обсуждение

давно
Мастер-Эксперт
425
4118
28.07.2008, 17:50
общий
User_X3

Встречные вопросы:
1. Выделена ли у Вас память под переменную buffer?
2. Достаточно ли выделено памяти, чтобы влезло всё то, что Вы пытаетесь туда впихнуть?
3. Самый главный вопрос: А ошибка то какая выскакивает? Или это секрет?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
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 проходов все дело при отлаживании встает и появляется окно процессора, где происходит хз что.
А насчет ошибки, я имел ввиду переход из библиотеки к другой функции, указывающей о завершении процесса считывания. То есть чтение было прервано или там еще хз что произошло.
давно
Мастер-Эксперт
425
4118
28.07.2008, 19:10
общий
User_X3

Боюсь, что с такими пояснениями ответа на свой вопрос Вы будете ждать долго...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.07.2008, 19:32
общий
угу, что ж поделаешь ((
давно
Мастер-Эксперт
425
4118
29.07.2008, 05:27
общий
"А насчет ошибки, я имел ввиду переход из библиотеки к другой функции, указывающей о завершении процесса считывания."
Единственное, чем Вы можете руководствоваться, что процесс считывания прошёл благополучно в функциях наподобие TStream.Read() - это количество прочитанных байт. Если оно совпадает с тем, что Вы задали, значит всё прочитано правильно, если количество равно нулю, то то чтения не произошло вовсе, если количество меньше заданного, значит Вы дошли до конца файла, что можно проверить дополнительно посмотрев TStream.Position которое, в этом случае, должно равнятся TStream.Size.

Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
29.07.2008, 17:50
общий
После "напрасных телодвижений" ничего не остается как ответит на свой вопрос:

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

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


Все гораздо проще
Форма ответа