Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Не работает 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 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1143699826
dera
2006-03-30 10:23
2006.04.23
Как поверх ХР поставить 98?


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


15-1143846834
MeF Dei Corvi
2006-04-01 03:13
2006.04.23
Программисты - музыканты?


2-1144682320
эксперт
2006-04-10 19:18
2006.04.23
вопрос...


1-1142636370
herki
2006-03-18 01:59
2006.04.23
делфя выдаёт ошибку при внесении формулы в ексэль