Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > TRegistry, не читаются имена подключей ветки


Автор: CynicRus 11.8.2015, 21:31
Добрый день господа.  Возникла следующая проблема: не могу прочитать значения ключей из определенной ветки реестра.
Объявляю ветку константой:
Код

    const
       MyKey = '\SOFTWARE\Microsoft\Windows Portable Devices\Devices'


И делаю с ней следующее:
Код

    var
      Str: TStringList;
      Reg: TRegistry;
    begin
      Str := TStringList.Create;
      Reg := TRegistry.Create;
      Reg.RootKey:=HKEY_LOCAL_MACHINE;
      try
        if Reg.OpenKeyReadOnly(MyKey) then
        begin
          Reg.GetKeyNames(Str);
          Str.SaveToFile('C:\Devices.txt');
        end;
      finally
        Reg.CloseKey;
        Str.Free;
      end;
    end;


и в Str - Count = 0. При этом, если скормить ветку \SOFTWARE\Microsoft\Windows Portable Devices - то GetKeyNames отрабатывает корректно. Это глюк TRegistry, или я что-то не так делаю? Права все стоят как надо. Данные регедитом вижу. Странно.

Delphi XE7 + Windows7 x64 Ultimate

Автор: CynicRus 12.8.2015, 11:53
Вообщем решил задачу через WinApi:
Код

function GetSubkeys(MainKey: LongInt; aKey: string; var aList: TStringList): Boolean;
var
  hRoot: HKEY;
  lItem: LongInt;
  hError: LongInt;
  szKey, pData: PChar;
  aString: string;
begin
  Result := false;
  if aList = nil then
    exit;
  try
    szKey := StrAlloc(Length(aKey) + 1);
    StrPCopy(szKey, aKey);
    lItem := 0;
    pData := StrAlloc(1024);
    hError := RegOpenKeyEx(MainKey, szKey, 0, Key_Read or KEY_WOW64_64KEY, hRoot);
    if hError = ERROR_SUCCESS then
    begin
      while (hError = ERROR_SUCCESS) do
      begin
        hError := RegEnumKey(hRoot, lItem, pData, 1024);
        if (hError = ERROR_SUCCESS) then
        begin
          Result := true;
          aList.Add(StrPas(pData));
          Inc(lItem);
        end;
      end;
      RegCloseKey(hRoot);
    end;
  finally
    StrDispose(szKey);
    StrDispose(pData);
  end;
end;

но категорически непонятно, почему она не решается через TRegistry с тем же ключём.

Автор: b8195108 26.9.2015, 16:15
Код

Reg := TRegistry.Create(KEY_WOW64_64KEY);


Добавлено через 2 минуты и 34 секунды
ЗЫ в вашем коде явные и неявные мемлики

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)