Главная страница
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.042 c
2-1132571963
Vovanchik
2005-11-21 14:19
2005.12.11
Эмулятор Windows


2-1132703422
SergP
2005-11-23 02:50
2005.12.11
Update одной таблицы из другой.


3-1130316165
alexliv
2005-10-26 12:42
2005.12.11
создание пользователя


2-1132129042
MakNik
2005-11-16 11:17
2005.12.11
dxDBGrid


2-1132879303
sergey1126
2005-11-25 03:41
2005.12.11
Не все ячейки красяться в stringgride