Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
4-1135365676
pol
2005-12-23 22:21
2006.03.19
Datecs fp3530t


3-1138362893
neat
2006-01-27 14:54
2006.03.19
Фильтр для Table


8-1128691651
sco
2005-10-07 17:27
2006.03.19
Ico


3-1138186225
SdrCoder
2006-01-25 13:50
2006.03.19
Variant or safe array is locked


2-1141574177
Музыкант
2006-03-05 18:56
2006.03.19
Как написать пианино?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский