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

Вниз

Получение предыдущего значения параметра спомошью RegQueryValueEx   Найти похожие ветки 

 
The One ©   (2005-11-26 16:26) [0]

Собственно, пытаюсь, зная хендл открытого ключа и имя его параметра получить значение этого параметра. Значение может быть целочисленным, либо строковым.

var Info: TRegDataInfo;
 DataType: Integer;
 buffer:Pointer;
 Len:Integer;
...
RegQueryValueEx(KeyHandle, ValueName, nil, @DataType,  PByte(Buffer),@Len);
showmessage(inttostr(integer(@Buffer)));//полагаю, что значение числовое

Ошибки не возникает, но и выбрасываемое сообщением значение - далеко от истинного. Писал код опираясь на TRegistry.ReadInteger, но вот что-то не выходит. Подскажите плиз решение.


 
begin...end ©   (2005-11-26 19:40) [1]

> The One ©   (26.11.05 16:26)

А Вы всё с реестром паритесь... :-)

Что возвращает функция? Выделено ли достаточно памяти для буфера Buffer, и почему бы не определить вначале нужный объём, вызвав функцию с Buffer = nil? Зачем "полагать, что значение числовое", если можно посмотреть на DataType?


 
The One ©   (2005-11-26 20:51) [2]


> А Вы всё с реестром паритесь... :-)

Угумс. Собственно, это последняя проблемма и можно сдавать курсач )

> Зачем "полагать, что значение числовое", если можно посмотреть
> на DataType?

Полагаю для удобства. Ибо мну нужно будет в событие класса передать указатель на данные и тип. Разбираться что и как будет уже напарник в своей части работы, мне нужно лишь для себя проверить, что я ему подсовываю правильные данные.


>  RegQueryValueEx(hKey, lpValueName, nil, @DataType,  nil,
> @info.DataSize);
>  RegQueryValueEx(hKey, lpValueName, nil, @DataType,
>  PByte(@Buffer),@info.DataSize);
>  if DataType=REG_DWORD then showmessage(inttostr(integer(Buffer)));
>  if DataType=REG_SZ then showmessage(string(@buffer));

Вот так вот вполне работает. Только вот не пойму почему в случае со string-ом приходится ставить собачку иначе EAccessViolation? Заметил, что если использовать PChar(buffer) то опять же все ОК, только вот данные в странной кодировке =)


 
begin...end ©   (2005-11-26 21:50) [3]

> The One ©   (26.11.05 20:51) [2]
> Вот так вот вполне работает.

Где выделение памяти для Buffer?

RegQueryValueEx(hKey, lpValueName, nil, @DataType, nil, @info.DataSize);
GetMem(Buffer, info.DataSize);
try
 RegQueryValueEx(hKey, lpValueName, nil, @DataType, Buffer, @info.DataSize);
 if DataType = REG_DWORD then
   ShowMessage(IntToStr(PInteger(Buffer)^))
 else if DataType = REG_SZ then
   ShowMessage(PChar(Buffer))
finally
 FreeMem(Buffer)
end


 
begin...end ©   (2005-11-26 22:04) [4]

Да, и ещё Remarks для RegQueryValueEx почитайте. Про завершающий нулевой символ.



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

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

Наверх




Память: 0.48 MB
Время: 0.048 c
2-1132721989
KGC
2005-11-23 07:59
2005.12.11
В чём фишка ?


8-1120913917
KyRo
2005-07-09 16:58
2005.12.11
Длинна песни и звук


14-1132560740
Bazi
2005-11-21 11:12
2005.12.11
BlowFish crypt


14-1132678609
YurikGL
2005-11-22 19:56
2005.12.11
Формат MS офиса будет открытым


5-1113813834
Max_005
2005-04-18 12:43
2005.12.11
Вывод текста в собственном компоненте