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 даст... )
Но как объяснить следующее?!
При получении имен субключей текущего ключа в некоторых случаях они [имена] оказываются усеченными! Причем, в прямом смысле...
Например, мне возвращается: "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
Глюк "на лицо". |
хммм... нельзя сказать, что я рад, но хотя бы убедился, что не только у меня такой глюк...
QUOTE (AVC @ 03/08/2005, 08:53) |
Решение — перейти на WinApi. Согласен с Vlad — это даже удобнее. |
надо попробовать... спасибо за совет!
|
|
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, которой передается неправильное значение маскимальной длины.
|
...и дали вот эту ссылочку.
|
|
|