Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

RegKeyGetBinary работает?   Найти похожие ветки 

 
nester   (2006-03-27 17:45) [0]

Так пишу

var
  buf: array of byte;
  key: HKEY;
  i: integer;
begin
     Stream.Position:= 0;
     setlength(buf, stream.Size);
     stream.Read(buf, stream.Size);
     KEY:= RegKeyOpenCreate(HKEY_CURRENT_USER, "Software");
     RegKeySetBinary(KEY, "LastUpdatedXW", buf, stream.Size);
     RegKeyClose(KEY);


А так читаю

var
  buf: array of byte;
  key: HKEY;
  ps: PStream;
  i: integer;
  s: string;
begin
  setlength(buf, 5);
  KEY:= RegKeyOpenRead(HKEY_CURRENT_USER, "Software");
  RegKeyGetBinary(KEY, "LastUpdatedXW", buf, 5);
  RegKeyClose(Key);
end;


Я знаю что в стриме 5 байт. Но
1) в записи на строке RegKeyClose(KEY); вылетает эксепшн, но все записывается.
2) при чтении буфер остается пустым.
Не может ли кто поделиться рабочим примером если не трудно?


 
ECM ©   (2006-03-27 20:19) [1]


> RegKeyGetBinary работает?

Работает.

> Не может ли кто поделиться рабочим примером если не трудно?

Нетрудно, пример:

procedure TForm1.Button2Click(Sender: PObj);
var
 Key: HKEY;
 TestArr: Array[0..255] of Byte;
begin
 Key := RegKeyOpenCreate(HKEY_CURRENT_USER,"Software");
 FillChar(TestArr,SizeOf(TestArr),$55);
 RegKeySetBinary(Key,"TestArr",TestArr,256);
 RegKeyClose(Key);
end;

procedure TForm1.Button3Click(Sender: PObj);
var
 Key: HKEY;
 TestArr: Array[0..255] of Byte;
begin
 Key := RegKeyOpenRead(HKEY_CURRENT_USER,"Software");
 RegKeyGetBinary(Key,"TestArr",TestArr,256);
 RegKeyClose(Key);
end;


Все пишется и читается....:))
Возможно у Вас где-то косяк в потоках...попробуйте для начала без них


 
nester   (2006-03-27 21:30) [2]

Хммм. Спасбо Евгений, действительно... Тока пока не понял где.
А вопрос вне темы - а сколько байт можно в бинари хранить в реестре?
Как реестр отнесется к примеру если я там буду хранить 100кб?


 
nester   (2006-03-27 21:43) [3]

Наше где проблемма. Во первых если буффер переменной длинны, то нужно давать указатель на нулевой элемент:
RegKeyGetBinary(Key,"TestArr",buf[0],256);
А во вторых если я сохранил 256 байт, а пытаюсь прочитать 10 байт - то на выходе белиберда.
Хмм. Никто не знает как сохранять буффер произвольной длинны?
Я собирался это делать так - первые 4 байта - это длинна буффера, а остальное сам буффер.
Но если я читаю первые 4 байта - то читается белиберда. А хранить длинну буффера в отдлельной переменной както...
Может подскажет кто идею?
Или как сделать чтобы RegKeyGetBinary читал все байты?
заранее благодарствую


 
ECM ©   (2006-03-28 11:41) [4]

Вопрос этой темы, достаточно элементарный и по большому счету мало относяйщийся к KOL. Не составит большого труда в нем разобраться самостоятельно,  и получить при этом более глубокие познания, чем прочитав чьё-то готовое решение. Для уменьшения частоты появления подобных вопросов, попробую привести алгоритм поиска ответа: :)))

1) Смотрим исходный код RegKey(S/G)etBinary в KOL.PAS

function RegKeyGetBinary( Key: HKey; const ValueName: String; var Buffer; Count: Integer ): Integer;
begin
 Result := 0;
 if Key = 0 then Exit;
 Result := Count;
 RegQueryValueEx( Key, PChar( ValueName ), nil, nil, @ Buffer, @ Result );
end;

//[function RegKeySetBinary]
function RegKeySetBinary( Key: HKey; const ValueName: String; const Buffer; Count: Integer ): Boolean;
begin
 Result := (Key <> 0) and (RegSetValueEx( Key, PChar( ValueName ), 0,
                   REG_BINARY, @ Buffer, Count ) = ERROR_SUCCESS);
end;


И видим, что эти функции - простая оболочка вокруг функций Win32 API
RegQueryValueEx
RegSetValueEx


2) Смотрим в MSDN (или Win32 API Help) про эти функции.Вот что можно прочитать для RegQueryValueEx:

If the buffer specified by lpData parameter is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of the lpData buffer are undefined.

Т.е. если мы запросим неверное количество (меньше) функция вернет ошибку и требуемый размер памяти для приема всего значения....
Итого для определения размера массива пользуемся следующим кодом:

var
 Key: HKEY;
 TestArr: Array[0..255] of Byte;
 Count: Integer;
begin
 Key := RegKeyOpenRead(HKEY_CURRENT_USER,"Software");
 Count := 10;
 Count := RegKeyGetBinary(Key,"TestArr",TestArr,Count);


Теперь Count у нас (см. [1] - 256) будет равен требуемому размеру и мы можем выделить память под весь массив. Следующий вызов (с полученным значением Count) вернет нам нужные данные...!!!

З.Ы. Если при первом вызове установить размер массива достаточно (что для своей программы обычно можно определить заранее) большим чтобы в любом случае данные поместились - мы сразу и прочитаем в массив данные и получим  их реальный размер.



Страницы: 1 вся ветка

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
15-1165745073
Интересующийся
2006-12-10 13:04
2007.01.14
Сканер Epson 3490/3590 Poto и работа с пленкой


2-1166959976
Jeeb
2006-12-24 14:32
2007.01.14
Добавление записи в БД


2-1166872963
Серый
2006-12-23 14:22
2007.01.14
stringgrid


3-1161686398
Sergey_b
2006-10-24 14:39
2007.01.14
Запросы


3-1161793929
rar
2006-10-25 20:32
2007.01.14
отключить пользователя от сервера