Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.014 c
2-1166652922
21h
2006-12-21 01:15
2007.01.14
Как отправить мессадж на сервер через TNMNNTP?


15-1166879717
ыгыгыгыгы
2006-12-23 16:15
2007.01.14
плинтус


1-1164283828
Krants\
2006-11-23 15:10
2007.01.14
Копирование из проводника


15-1166725252
alexsis
2006-12-21 21:20
2007.01.14
Чё за фигня с этими часами??


15-1166634448
Pit_q
2006-12-20 20:07
2007.01.14
Настольый теннис





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский