C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TRegistry — глюки Builder-а?, и снова, и опять... %))
BreakPointMAN
Отправлено: 02.08.2005, 23:43


Станционный диспетчер

Группа: Участник
Сообщений: 86



Всем привет!

Итак, что имеем:

  • C++ Builder 6 (Build 10.166 Update 4)
  • программу, использующую класс TRegistry для доступа к реестру
  • и операционную систему MS Windows 2000 SP4
Вообщем, все бы ничего, но стал я наблюдать некоторые странные вещи при работе с реестром. А именно в следующих случаях:

  • при установке текущими некоторых ключей (с помощью методов OpenKey/OpenKeyReadOnly)
  • при попытке получить имена субключей в некоторых случаях (с помощью метода GetKeyNames)


Ну, насчет первого пункта, в принципе, можно найти объяснения, например, нехватка прав или попытка доступа к системным ветвям (таким образом у меня не открылись, например, HKEY_LOCAL_MACHINE\SAM\SAM, HKEY_LOCAL_MACHINE\SECURITY и еще ряд ключей). Да и Borland где-то писала, что такого плана вещи читать лучше через WinAPI (если это еще Windows даст... biggrin.gif )


Но как объяснить следующее?!

При получении имен субключей текущего ключа в некоторых случаях они [имена] оказываются усеченными! Причем, в прямом смысле...
Например, мне возвращается: "Remova" вместо "RemovableMedia" (это ветка HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\STORAGE\) или ".NET CLR Networki" вместо ".NET CLR Networking" (ветка HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\) и еще в ряде случаев...

Что еще более странно, иногда в качестве имен субключей возвращаются пустые значения! Например, в разделе HKEY_LOCAL_MACHINE в ветке SYSTEM\ControlSet002\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318} есть два вполне нормальных субключа "0000" и "0001" — вместо них мне возвращается пустая строка...

Всего по всем разделам и веткам реестра таких "глючных" ключей набегает около 200 штук.
В принципе, и хрен бы с ним, не так уж они мне и нужны... Просто интересно, это я что-то делаю не так или это очередной Builder-овский глюк?

Если кому интересно, могу выложить исходник, но вроде бы в нем все верно, там строится дерево TreeView и заполняется именами ключей, все это проделывается рекурсивно...

А если кто сталкивался с такой штукой — плз поделитесь, что вы думаете на этот счет?
olegenty
Отправлено: 03.08.2005, 07:25


Ветеран

Группа: Модератор
Сообщений: 2412



не сталкивался. покажи, как и что ты там читаешь...
Vlad
Отправлено: 03.08.2005, 07:44


Машинист паровоза

Группа: Участник
Сообщений: 231



Используй API, точно будет нормально работать и кстати, при использовании WINAPI , получается даже удобнее. Выложи исходник -посмотрим, что за глюк.
AVC
Отправлено: 03.08.2005, 08:53


Ветеран

Группа: Модератор
Сообщений: 1583



Проверил. BCB5 Win2k sp4.
CODE

reg->RootKey = HKEY_LOCAL_MACHINE;
if (reg->OpenKeyReadOnly("\SYSTEM\ControlSet002\Enum\STORAGE"))
{  reg->GetKeyNames(slist);
   reg->CloseKey();
   Memo1->Lines->Text = slist->Text;
}

Результат
Remova
Volume
Глюк "на лицо".
Решение — перейти на WinApi. Согласен с Vlad — это даже удобнее.
CODE

AnsiString SubKey = "SYSTEM\ControlSet002\Enum\STORAGE";
HKEY hKey;
long lerr;

lerr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey.c_str(), 0, KEY_READ, &hKey);
if (!ShowApiLError(lerr, "RegOpenKey"))  return;

здесь нужно RegQueryInfoKey

char buf[1000];
for (int i=0; i < 10; i++)
{  lerr = RegEnumKey(hKey, i, buf, sizeof(buf));
   if (lerr != ERROR_SUCCESS) break;
   Memo1->Lines->Add(AnsiString(buf));
}

RegCloseKey(hKey);

RemovableMedia
Volume
BreakPointMAN
Отправлено: 03.08.2005, 09:12


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (AVC @ 03/08/2005, 08:53)
Проверил. BCB5 Win2k sp4.

Результат

Remova
Volume

Глюк "на лицо".


хммм... нельзя сказать, что я рад, но хотя бы убедился, что не только у меня такой глюк... cool.gif

QUOTE (AVC @ 03/08/2005, 08:53)

Решение — перейти на WinApi. Согласен с Vlad — это даже удобнее.


надо попробовать... smile.gif спасибо за совет!
Doga
Отправлено: 03.08.2005, 15:21


Мастер участка

Группа: Участник
Сообщений: 575



Тут недавно уже пробегала тема про глюки: "Глюки сойки 6".Может стоит выделить отдельную ветку для таких тем, что бы не наступать постоянно на те же грабли?

Отредактировано Doga — 03/08/2005, 15:22
BreakPointMAN
Отправлено: 03.08.2005, 17:31


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (Doga @ 03/08/2005, 15:21)
Тут недавно уже пробегала тема про глюки: "Глюки сойки 6".Может стоит выделить отдельную ветку для таких тем, что бы не наступать постоянно на те же грабли?

Полностью разделяю и поддерживаю сие предложение!
еще и прикрепить эту тему наверху, чтобы никуда не девалась и была видна... вот...

а насчет обсуждаемого глюка мне вот на форуме http://forum.sources.ru ответили следующее:
QUOTE

Это не глюк Билдера, а глюк в недрах Windows.

Борландовская GetKeyNames вызывает функцию RegQueryInfoKey, которая при некоторых условиях возвращает неправильную максимальную длину для имен подключей (поле cbMaxSubKeyLen). Таким образом выделяется недостаточно места для хранения имени ключа и имена урезаются. Далее в цикле идет переборка при помощи RegEnumKeyEx, которой передается неправильное значение маскимальной длины.


...и дали вот эту ссылочку.

Вернуться в Вопросы программирования в C++Builder