Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти, под динамический массив, не пойму как. 
:(
    Опции темы
allx
Дата 1.9.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



Здравствуйте! Подскажите пожалуйста, в чем проблема! D2005, читаю бинарное значение в реестре.


Код

Procedure TForm3.FillListview(SubPath: string; List: TStringList);
var
  s: string;
  lp1, BufSize, i        : integer;
  buffer: PByteArray;
  p: Pointer;
begin

              CASE GetRegDataType(list[lp1]) of
              reg_binary:
                       begin
                               listitem.SubItems.Add('REG_BINARY');
                               Bufsize:=ReadRegBinaryData(list[lp1],p,i);  // читаем только размер, при отладке 
                                //показывает что размер читается правильно - для моего значения это 1024 байта
                               GetMem(buffer,Bufsize); // выделяем память под буффер
                               ReadRegBinaryData(list[lp1],buffer,bufsize);  // читаем сам буффер
                               <делаем что-л с буффером>
                               FreeMem(buffer);
                       end;
              end;
end;    


Так вот. Приведенный выше пример не работает, выскакивает Acess Violation...
НО вот в чем горе!!!
если указать
GetMem(buffer,1024);
т.е. выделить ровно столько же сколько присваивается переменной Bufsize при отладке, то все работает!

ReadRegBinaryData - функция содрана из программы которая 100% работает. В ней впринципе нечему ошибаться, проходит она нормально, работает можно сказать только посредником.

Помогите! Может быть как-то можно написать чтобы работало, уже руки опускаются прямо...

Это сообщение отредактировал(а) allx - 1.9.2005, 10:53
PM MAIL   Вверх
_hunter
Дата 1.9.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



начну с простого вопроса: выскакивает где?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
allx
Дата 1.9.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



_hunter
Усе, с этим разобрался, с горем пополам - написал сам функцию GetRegDataSize, отладил и все стало на места. smile
Кстати, спасибо за вопрос, пошаговая отладка цикла и привела к результатам, оказывается первый элемент считывался нормально (не binary), а ошибка выскакивала на втором, будь он бинарный или какой-л другой.

Вопрос номер два, по этой же теме. Теперь пишу в реестр smile)) Приспособил компонент MPHexEditor, работает правда через потоки, код на запись такой (считываю из файла и пишу в реестр):


Код

procedure WriteData;
var
  stream2: Tfilestream;
  bufsize: integer;
  ba: array of byte;
begin
                         STREAM2:=TFileStream.Create('Temp.tmp',fmCreate); //создаем поток в файл
                         Hexedit1.SaveToStream(stream2); //эта процедура как надо сохраняет содержимое
                         // визуального компонента - HEX-редактора в файл, причем сохраняет правильно - проверял
                         Bufsize:=Hexedit1.DataSize; //функция выдает размер данных в редакторе
                         Setlength(ba, Bufsize); 
                         stream2.Read(ba,Bufsize); //считываем поток в буффер - массив байтов 
                          //заданной величины, в массиве 
                         WriteBinaryData(ValueName,ba,Bufsize); //Вот тут и выходит фигня, в реестр записывается
                         // (bufsize)  байт  лабуды - например текст заголовка окна :)
                         stream2.Free;
end;


так вот вопрос: если опустить тонкости, строка записи в реестр следующая (по функции)
Код

procedure WriteData(const Name: string; var Buffer; BufSize: Integer);
begin
RegSetValueEx(CurrentKey, WName{имя значения в уникоде}, 0, REG_BINARY {константа, на самом деле DWORD-число}
,  @Buffer{указатель на буффер}, BufSize);
end;


Я явно напортачил с указателем... Вопрос - где. ?
{ДОПОЛНЕНИЕ}
Не с указателем! проблема вот здесь:


Код

                         stream2.Read(ba,Bufsize); //считываем поток в буффер - массив байтов 
                          //заданной величины, в массиве 

Считывает в буффер НУЛИ (ф-я выдает 0). а процедура stream2.ReadBuffer выдает STREAM READ ERROR.

Это сообщение отредактировал(а) allx - 1.9.2005, 23:23
PM MAIL   Вверх
p0s0l
Дата 1.9.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Перед Stream.Read надо указатель вернуть на начало данных... И читать надо немного по-другому... (скорее всего в WriteBinaryData тоже самое)
Код
stream2.Position := 0;
stream2.Read(ba[0],Bufsize); //считываем поток в буффер - массив байтов //заданной величины, в массиве



--------------------
С уважением, г-н Посол.
PM   Вверх
allx
Дата 2.9.2005, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



p0s0l
Я начинаю верить во всеобщее информационное поле smile Я только что дошел до этого сам, вернулся в форум чтобы поделиться результатом.
Интересно, почему об этом не сказано ни в доках, ни в FAQ.

А в целом, прям облегчение, бился много часов. СПАСИБО БОЛЬШОЕ!
PM MAIL   Вверх
_hunter
Дата 2.9.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



Цитата
Интересно, почему об этом не сказано ни в доках, ни в FAQ.

считается и так понятным smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.