Главная страница
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.044 c
2-1141333316
serko
2006-03-03 00:01
2006.03.19
String


10-1112691891
bon
2005-04-05 13:04
2006.03.19
AutoCad & Delphi


6-1134137180
skiermax
2005-12-09 17:06
2006.03.19
Exchange Server 2000&MAPI


2-1141374777
Neo Trinitron
2006-03-03 11:32
2006.03.19
Гиперссылка на форме


15-1140594096
Ученик чародея
2006-02-22 10:41
2006.03.19
Трансгенные организмы.