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

Вниз

Access violation в рекурсивной процедуре   Найти похожие ветки 

 
DesperadO666 ©   (2006-02-27 18:37) [0]

Знатоки, помогите пожалуйста...
Если вызывать
 ErrParam:= RegQueryValueEx(MyKey,"DriverDesc",nil,@DataType,nil,@DataSize);
все в порядке, а если
 ErrParam:= RegQueryValueEx(MyKey,"DriverDesc",nil,@DataType,@Data,@DataSize);
то при рекурсивных вызовах процедуры вылетает с access violation

Привожу код.

procedure Tform1.Reg_Rec(Key :HKey; SubKey : String );
var
 MyKey,MySubKey   : Hkey;
 ErrKey,ErrSub,ErrParam  : Integer;
 i : byte;
 {DataType : array[0 .. 20] of char; }
 DataType :Integer;
 Data : array[0 .. 70] of char;
 Buffer : array[0 .. 50] of char;
 DataSize :Integer;
begin
 ErrKey:=RegOpenKeyEx(Key ,PChar(Subkey),0,KEY_READ,MyKey);
 if ErrKey = ERROR_SUCCESS then
 begin
   //FillChar(DataType,sizeof(DataType),0);
   FillChar(Data,sizeof(data),0);
   ErrParam:= RegQueryValueEx(MyKey,"DriverDesc",nil,@DataType,@data{nil},@DataSize);
   if ErrParam = ERROR_SUCCESS then
     memo1.lines.add(SubKey +" "+ "Найден")
   else
   begin
     memo1.lines.add(SubKey +" "+ " Не Найден  "+ InttoStr(ErrParam));
     //Writeln(f,SubKey +" "+ " Не Найден  "+ InttoStr(ErrParam))
   end;

   i:=0;
   ErrKey:=RegEnumKey(MyKey,i,Buffer,Sizeof(Buffer));
   while ErrKey = ERROR_SUCCESS  do
   begin
     ErrSub:= RegOpenKeyEx(MyKey,Buffer,0,KEY_READ,MySubKey);
     if ErrSub = ERROR_SUCCESS then
       Reg_Rec(MyKey,Buffer);
     RegCloseKey(MySubKey);

     inc(i);
     ErrKey:=RegEnumKey(MyKey,i,Buffer,Sizeof(Buffer));
   end;
 end;
 RegCloseKey(MyKey);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
key :HKey;
begin
 if RegOpenKey(HKEY_LOCAL_MACHINE,nil,Key) = ERROR_SUCCESS then
 begin
     Reg_Rec(Key,"SYSTEM\CurrentControlSet\Control\Class\");
 else
   MessageDlg("Нет такого раздела !!", mtError, [mbOk], 0);
end;


 
novice_man ©   (2006-02-27 19:06) [1]

Вот что нарыл:
Размер возвращаемых данных изменяется динамически, поэтому заранее предсказать необходимый размер буфера невозможно. Если размер буфера недостаточен, функция вернёт код ошибки ERROR_MORE_DATA. Обычно RegQueryValueEx вызывается в цикле с постепенным увеличением буфера.

Если поставить Data : array[0 .. 10000] of char;

> Data : array[0 .. 70] of char;
, например, ошибка не "вылазит".


 
DesperadO666 ©   (2006-02-27 19:15) [2]

Спасибо, помогло... Все память экономил :)
Но чую возникнит еще вопрос...
Не работала эта вещь и под Win98. Попробую - скажу результат.


 
novice_man ©   (2006-02-27 19:49) [3]

DesperadO666 ©   (27.02.06 19:15) [2]
256 байт длины буфера достаточно для сканировани всего реестра


 
DesperadO666 ©   (2006-02-28 09:19) [4]


> 256 байт длины буфера достаточно для сканировани всего реестра

Да, так и сделал.
А предполагаемая проблема под Win98 осталась :(
Так
ErrParam:= RegQueryValueEx(MyKey,"DriverDesc",nil,@DataType,@data{nil},@DataSize);
пишет ERROR_INVALID_PARAMETER
А так
ErrParam:= RegQueryValueEx(MyKey,"DriverDesc",nil,@DataType,nil,@DataSize);
пишет ERROR_FILE_NOT_FOUND


 
DesperadO666 ©   (2006-02-28 18:22) [5]

help


 
DesperadO666 ©   (2006-03-03 14:52) [6]

Народ, помогите, плз....
Что ни у кого Win98 уже не осталось...


 
novice_man ©   (2006-03-03 15:31) [7]

hKey
A handle to the registry key to read the value from. This could also be one of the following flags identifying one of the predefined registry base keys:
HKEY_CLASSES_ROOT
The HKEY_CLASSES_ROOT base key.
   HKEY_CURRENT_CONFIG
The HKEY_CURRENT_CONFIG base key.
   HKEY_CURRENT_USER
The HKEY_CURRENT_USER base key.
   HKEY_DYN_DATA
Windows 95, 98:
The HKEY_DYN_DATA base key.
   HKEY_LOCAL_MACHINE
The HKEY_LOCAL_MACHINE base key.
   HKEY_PERFORMANCE_DATA
Windows NT, 2000:
The HKEY_PERFORMANCE_DATA base key.
 HKEY_USERS
The HKEY_USERS base key.

может поможет...



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

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

Наверх




Память: 0.48 MB
Время: 0.041 c
15-1140786791
Новичоккк
2006-02-24 16:13
2006.03.19
Посоветуйте дешевый хостинг


3-1138095220
dtm
2006-01-24 12:33
2006.03.19
Кодировка поля таблицы типа "text" - can not transliterate


8-1129184506
kyn66
2005-10-13 10:21
2006.03.19
Где найти ?


2-1141064094
Michael5
2006-02-27 21:14
2006.03.19
Вопрос по System tray.После выхода из программы ярлык не исчезает


2-1141146829
ViktorZ
2006-02-28 20:13
2006.03.19
Apllication not applicable