Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизНе работает RegEnumValue Найти похожие ветки
← →
Illuha_y (2006-02-02 04:03) [0]Не могу прочесть данные из реестра, функция RegEnumValue, выдает ошибку 259. Ниже привожу кусоккода. Подскажите че не так делаю?
procedure TForm1.SkanKey(HKey_: HKEY; KeyStr, Name: string;
var Value: TRegKeyInfo;var Alist:TStringList);
var
key: HKEY;
i,j,d:integer;
CountKey,LenKey,NumVal: word;
KeyName,ValueName, st: string;
Mem: TMemoryStream;
RegType: byte;
SizeData: integer;
len: DWORD;
begin
FillChar(value, SizeOf(TRegKeyInfo), 0);
ErrorCode:= RegOpenKeyEx(Hkey_,PChar(name) , 0, KEY_READ, Key);
if ErrorCode <> ERROR_SUCCESS then
Mlist.Add("[RegOpenKeyEx ERROR № "+IntToStr(ErrorCode)+"] " + name)
else try
ErrorCode:= RegQueryInfoKey(key,nil,nil,nil,@Value.NumSubKeys,
@Value.MaxSubKeyLen,nil,@Value.NumValues,@Value.MaxValueLen,
@Value.MaxDataLen,nil,nil);
mem:= TMemoryStream.Create;
try
Len:= value.MaxValueLen+1;
for j:= 1 to value.NumValues do begin
ErrorCode:= RegEnumValue(HKey_,j,PChar(ValueName),Len,0,@RegType,
mem.Memory, @value.MaxDataLen);
if ErrorCode <> 0 then
MessageBox(0,PChar(IntToStr(ErrorCode)),"error", MB_OK);
{*****************}
end;
finally
mem.Free;
end;
finally
RegCloseKey(key);
end;
end;
← →
kaZaNoVa © (2006-02-02 04:13) [1]Illuha_y (02.02.06 4:03)
ошибку 259
"дополнительные данные отсутствуют" (SysErrorMessage()
)
← →
illuha_y (2006-02-02 18:06) [2]
> "дополнительные данные отсутствуют" (SysErrorMessage())
На самом деле данные в этом ключе присутствуют.
← →
Игорь Шевченко © (2006-02-02 18:38) [3]
> mem:= TMemoryStream.Create
А Size есть у этого MemoryStream ?
← →
fellix (2006-02-02 18:55) [4]
j:= 0 ;
while True do begin
ErrorCode := RegEnumValue(HKey_, j, ..........);
if ErrorCode <> ERROR_SUCCESS then Break;
...................
Inc(j);
end;
if ErrorCode <> 259 {ERROR_NO_MORE_ITEMS} then {была ошибка};
← →
illuha_y (2006-02-02 20:07) [5]
> Игорь Шевченко
> А Size есть у этого MemoryStream ?
извиняюсь размерчик забыл пишем mem.SetSize(value.MaxDataLen); перед строкой Len:= value.MaxValueLen+1;, но ничего не меняеться, все таже ошибка.
> fellix (02.02.06 18:55) [4]
>
>
> j:= 0 ;
> while True do begin
> ErrorCode := RegEnumValue(HKey_, j, ..........);
> if ErrorCode <> ERROR_SUCCESS then Break;
> ...................
> Inc(j);
> end;
> if ErrorCode <> 259 {ERROR_NO_MORE_ITEMS} then {была ошибка};
>
Я извеняюсь я пока не силен в програмировании, что мне дае этот код? Если не трудно поподробней.
Програмка в принципе сканирует реестр ключик за ключиком, так во т ключи то читаются, а вот данные из этих ключей ни как.
← →
fellix (2006-02-02 22:39) [6]RegEnumValue перебирает "значения" внутри ключей. "J" изменяется от 0 и до упора - выход из цикла по ошибке или по NO_MORE_ITEMS.
← →
illuha_ (2006-02-03 03:37) [7]
> ellix (02.02.06 22:39) [6]
>
> RegEnumValue перебирает "значения" внутри ключей. "J" изменяется
> от 0 и до упора - выход из цикла по ошибке или по NO_MORE_ITEMS.
>
Зделал
FillChar(value, SizeOf(TRegKeyInfo), 0);
ErrorCode:= RegOpenKeyEx(Hkey_,PChar(name) , 0, KEY_READ, Key);
if ErrorCode <> ERROR_SUCCESS then
Alist.Add("[RegOpenKeyEx ERROR № "+IntToStr(ErrorCode)+"] " + name)
else try
ErrorCode:= RegQueryInfoKey(key,nil,nil,nil,@Value.NumSubKeys,
@Value.MaxSubKeyLen,nil,@Value.NumValues,@Value.MaxValueLen,
@Value.MaxDataLen,nil,nil);
if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then
with value do begin
inc(MaxSubKeyLen,MaxSubKeyLen);
inc(MaxValueLen,MaxValueLen);
end;
mem:= TMemoryStream.Create;
try
mem.SetSize(value.MaxDataLen);
Len:= value.MaxValueLen+1;
j:= 1;
while (j = value.NumValues) or (ErrorCode = ERROR_NO_MORE_ITEMS) do begin
ErrorCode:= RegEnumValue(HKey_,j,PChar(ValueName),Len,0,@RegType,
mem.Memory, @value.MaxDataLen);
if ErrorCode <> ERROR_SUCCESS then Break;
inc(j);
end;
finally
mem.Free;
end;
finally
RegCloseKey(key);
end;
А в итоге цикл невыполнился ни разу?
← →
Игорь Шевченко © (2006-02-03 10:53) [8]RTFS: registry.pas procedure TRegistry.GetValueNames(Strings: TStrings);
для организации цикла. Там же смотреть получение значений в методе MoveKey
← →
fellix (2006-02-03 12:41) [9]> illuha_ (03.02.06 03:37) [7]
Блин, третий раз подчеркиваю: индекс ДОЛЖЕН изменяться не от единицы, а от НУЛЯ!!! Внимательнее будьте. И при чтении документации (Help, MSDN) тоже:
dwIndex - Specifies the index of the value to retrieve. This parameter should be ZERO for the first call to the RegEnumValue function and then be incremented for subsequent calls. Because values are not ordered, any new value will have an arbitrary index. This means that the function may return values in any order.
P.S. Усложняете цикл - NumValues там ни к чему. Лишняя проверка. Хотя, если очень хочется, можете перебирать от 0 до NumValues-1.
Возможно, так прозрачнее:for j := 0 to MaxInt do
case RegEnumValue(HKey_, j, ............ ) of
ERROR_SUCCESS : begin {здесь обработка очередного Value} end;
ERROR_NO_MORE_ITEMS: Break; //это нормальный выход
else begin MessageBox(0, "Какая-то ошибка.", nil, 0); Break; end;
end;
← →
illuha_y (2006-02-04 03:59) [10]
> fellix (03.02.06 12:41) [9]
Я благодарен вам за терпение так сказать со мной неродивым.
Все зделал, вроде как положено, но всеравно вылетает ошибка, теперь что нет доступа
Access violation at address 7C913144 in module "ntdll.dll". Write of address 00404335.
← →
fellix (2006-02-04 11:24) [11]Это уже другая проблема - пройдитесь в отладчике, найдите, откуда ноги растут...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c