Форум: "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.PASfunction 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 APIRegQueryValueEx
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.012 c