Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Выделение памяти


Автор: allx 1.9.2005, 10:52
Здравствуйте! Подскажите пожалуйста, в чем проблема! 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% работает. В ней впринципе нечему ошибаться, проходит она нормально, работает можно сказать только посредником.

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

Автор: _hunter 1.9.2005, 11:00
начну с простого вопроса: выскакивает где?

Автор: allx 1.9.2005, 21:34
_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.

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

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

А в целом, прям облегчение, бился много часов. СПАСИБО БОЛЬШОЕ!

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)