![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глючит RegEnumValues [D4, Win95/98]
Cobalt © (2002-07-20 12:08:00)Пытаюсь перебрать параметры ключа HKEY_LOCAL_MACHINE.(Всего их там у меня 2:
"IE State"=dword:00000000
"FullLogging"="No")
Procedure AddValues(HK:HKEY;K_Id:integer);
var CntValues, vType, MaxNameLen, MaxDataLen:Cardinal;
i, NameLen, BufLen:Cardinal;
Buf:Pointer;
VName,s:string;
begin
if RegQueryInfoKey(HK,nil,nil,nil, nil,nil,nil,@CntValues,@MaxNameLen,@MaxDataLen,nil,nil)<>ERROR_SUCCESS
then begin
ShowMessage(SysErrorMessage(GetLastError)); exit;
end;
if CntValues<1 then exit;
for i:= 0 to CntValues-1 do
begin //MaxNameLen - does not include the terminating null character
NameLen:=MaxNameLen+1; // include the terminating null character.
SetLength(VName,NameLen);
BufLen:=MaxDataLen;
Buf:=AllocMem(BufLen);
if RegEnumValue(HK,i,PChar(VName),NameLen, nil,@vType,@Buf,@BufLen)<>ERROR_SUCCESS
then begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end;
SetLength(VName,NameLen);//обязательно!!!
VName:=VName+"Type = "+IntToStr(vType)+" Size = "+IntToStr(BufLen);
Form1.ListBox1.Items.Add(VName);
FreeMem(Buf);
end;
end;
Так вот, имена параметров возвращаются нормально, а вот со значениями - напряг. При первом проходе возвращает в Buf NIL, грит, "ошибки нет, все ОК!"
При втором проходе тоже ок, но Buf не обнуляется, а приFreeMem(Buf);выскакивает АВ.
Cobalt (2002-07-23 18:52:00) [1]>Случайный прохожий
Извиняюсь. Дико.
Я был не прав.
Случайный прохожий (2002-07-22 21:46:00) [2]Дык я ж твою функцию с исправленным буф тока-что погонял по реестру - никаких ошибок!
> А потом перестала...
Чудеса! В решете.
Cobatl (2002-07-22 14:26:00) [3]Не, это почему же врать?
Я действительно так попробовал, и тоже вернула ошибку ("неправильный параметр")
А потом перестала...
Случайный прохожий (2002-07-22 09:38:00) [4]Не ну ты фрукт! Не стыдно врать?
Cobalt (2002-07-21 23:10:00) [5]И так (RegQueryValueEx(HK,PChar(VName),nil,@vType,Buf,@BufLen))
я тоже пробовал, тоже грит - еррор.
Попробовал как в TRegistry - через дополнит. проц-ру, ошибку уже не возвращает.
Буду разбираться...
Случайный прохожий (2002-07-21 20:11:00) [6]А вот так не пробовал?
if RegQueryValueEx(HK,PChar(VName),nil,@vType, Buf,@BufLen)<>ERROR_SUCCESS
И хелп бы почитал. Заодно.
ЗЫ А зачем тебе вообще буфер, если ты его не используешь? Поставь нил и все дела.
Cobalt (2002-07-20 14:25:00) [7]Если читаю DWord-ы, то ок. но как только появляется string или binary, то начинаются сплошь АВ
Cobalt (2002-07-20 12:33:00) [8]Попробовал использовать RegQueryValue, все равно возвращает nil, и, сволочь, грит - "Все ОК!"
NameLen:=MaxNameLen+1; // include the terminating null character.
SetLength(VName,NameLen);
if RegEnumValue(HK,i,PChar(VName),NameLen, nil,@vType,nil,nil)<>ERROR_SUCCESS
then begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end; //получаем только имя параметра
SetLength(VName,NameLen);//обязательно!!!
BufLen:=MaxDataLen;
Buf:=AllocMem(BufLen);
if RegQueryValueEx(HK,PChar(VName),nil,@vType,@Buf,@BufLen)<>ERROR_SUCCESS
then begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end;
VName:=VName+"Type = "+IntToStr(vType)+" Size = "+IntToStr(BufLen);
Form1.ListBox1.Items.Add(VName);
FreeMem(Buf);