Форум: "Начинающим";
Текущий архив: 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.013 c