Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.011 c
15-1143831562
Мазут Береговой
2006-03-31 22:59
2006.04.23
Течет память...


2-1144271250
Farpik
2006-04-06 01:07
2006.04.23
ОБНОВИТЬ!


9-1125775248
Warstone
2005-09-03 23:20
2006.04.23
GLScene нужен OpenGL 1.1


15-1143721344
Mike Kouzmine
2006-03-30 16:22
2006.04.23
Не успели запустить бразильца в космос, как


3-1140778152
John_Doe
2006-02-24 13:49
2006.04.23
AVG,передача данных из 1 таблицы в другую,соблюдая группировку





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский