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

Вниз

Поиск ключа в реестре.   Найти похожие ветки 

 
Василий Иванович ©   (2010-12-03 18:20) [0]

Товарисчи, помогите пожалуйста мне с одной проблемкой, на Delphi надо найти определенный ключ в реестре. Дело обстоит так -
Вот тут HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_12d1&Pid_1003&MI_03» у меня находятся много ключей с разными именами типа « 6&14ed3005&1&0003», при чем на разных машинах могут быть разные названия и разные количества этих ключей. Так вот, заранее мне не известно, в каком-то из них присутствует ключ «Control» (а он там появляется, если подключено устройство). Как определить в какой из ключей он находится? Я даже не представляю себе как это организовать, надеюсь на вашу помощь!


 
И. Павел ©   (2010-12-03 18:33) [1]

reg.OpenKey(".../../..", false) - открывает ветку реестра, переданную в виде первого аргумента.
reg.GetKeyNames() - возвращает список всех подветок текущей ветки реестра.
reg.ValueExists("Control") - вернет true, если в текущей ветке реестра есть ваше значение.

Проходите по всем тем веткам, которые вернет GetKeyNames, и ищете в них Control (ValueExists("Control")). Ну а остальное - дело техники :)


 
Василий Иванович ©   (2010-12-03 20:14) [2]

reg.OpenKey(".../../..", false) - откроет, если только дать разрешение на полный достутуп для этой ветки реестра. reg.OpenKeyReadOnly - открывает...

reg.ValueExists("Control") - не возвращает, по ходу по той-же причине, из-за  отсутствия полного доступа к этой ветке реестра.


 
Anatoly Podgoretsky ©   (2010-12-03 20:51) [3]

Василий Иванович ©   (03.12.10 20:14) [2]
Ой как ты не прав, поскольку Create имеет параметры, а еще и свойство Access есть, которые значительно мощнее OpenKeyReadOnly, который ввели на угоду ламерам.


 
Игорь Шевченко ©   (2010-12-03 21:58) [4]

use SetupAPI, Luke


 
Василий Иванович ©   (2010-12-03 22:42) [5]

Anatoly Podgoretsky ©
Если Вам не сложно - приведите пример, то что предлагает И. Павел © есть в и-нете. Но не работает по причине разграничения прав доступа в реестре. Но если Вы подкрепите свои слова кодом - буду признателен, ибо не зря пишу в раздел "начинающим" и прошу помощи, а не высказываний.

Игорь Шевченко ©
Большое спасибо за совет. Но если подкрепите пожелание кодом - буду признателен, ибо не зря пишу в раздел "начинающим" и прошу помощи, а не высказываний и пожеланий.


 
Leonid Troyanovsky ©   (2010-12-03 23:03) [6]


> Василий Иванович ©   (03.12.10 22:42) [5]

> кодом - буду признателен, ибо не зря пишу в раздел "начинающим"
> и прошу помощи, а не высказываний.

> - буду признателен, ибо не зря пишу в раздел "начинающим"
> и прошу помощи, а не высказываний и пожеланий.

Благостен муж ищущий, бо потеряв драхму и зажегши светильник
найдет он оную.

--
Regards, LVT.


 
_Юрий   (2010-12-04 01:18) [7]


> Василий Иванович ©   (03.12.10 20:14) [2]


Там косяк в логике с этим RO, если посмотреть код.
Он после вызова какой то флаг запоминает, и потом использует, а не должен, подробностей не помню, нет под рукой среды. Надо либо смотреть код TRegistry и пытаться понять, как написать чтобы сработало правильно, либо использовать API.
Какое именно API использовать опять таки станет понятно из кода TRegistry


 
Anatoly Podgoretsky ©   (2010-12-04 08:58) [8]

> Василий Иванович  (03.12.2010 22:42:05)  [5]

Код есть в справке, ну не копировать же его сюда. Да и какой код, аж смешно
стало

reg.Access := константа

или

reg := Tregistry.Create(константа);

Это простите, но это деградация как программиста, ведь с таким уровнем
нельзя даже допускать пол подметать около программиста.


 
Василий Иванович ©   (2010-12-04 11:48) [9]

Anatoly Podgoretsky ©
За две недели после установки Delphi и такая деградация... Сам в шоке... Наверняка не стоило и ставить, да?

Leonid Troyanovsky ©
А под фонарным столбом искать лучше. Там светлее, да?

Вот такой код. Устройстово подлючено, ключ "Control" присутствует. Где не так?
procedure TForm1.Button1Click(Sender: TObject);
var
reg : TRegistry;
s   : TStringList;
i   : Integer;
begin
 s:=TStringList.Create;
 reg:=TRegistry.Create;
 reg.RootKey:=HKEY_LOCAL_MACHINE;
 reg.OpenKeyReadOnly("SYSTEM\CurrentControlSet\Enum\USB\Vid_12d1&Pid_1003&MI_01") ;
 reg.GetKeyNames(s);
 reg.CloseKey;
for i:=0 to s.Count-1 do ListBox2.Items.Add(s[i]);

for i:=0 to s.Count-1 do
   begin
       reg.OpenKeyReadOnly("SYSTEM\CurrentControlSet\Enum\USB\Vid_12d1&Pid_1003&MI_01\" +s[i]);
       If reg.ValueExists("Control") then
         ListBox1.Items.Add(s[i]);
       reg.CloseKey;
   end;
 reg.Free;
end;

end.


 
sniknik ©   (2010-12-04 12:29) [10]

> ключ "Control" присутствует. Где не так?
> If reg.ValueExists("Control") then
смотришь на ключ, а ищешь значение?


 
И. Павел ©   (2010-12-04 16:23) [11]


> Василий Иванович ©

Вы до сих пор не установили свойство Access, как вам советовали в [3] и [8]. Попробуйте поработать с ним. Задать его можно как напрямую, так и в конструкторе. Например:

reg := TRegistry.Create(KEY_READ);
Хотя, наверное, нужно будет еще добавить KEY_ENUMERATE_SUB_KEYS и др.

Вот кусок справки:


> Use Access to specify the level of security access to use
> when opening keys. The OpenKey method uses the value of
> Access when opening a registry key. Access is initialized
> by the TRegistry constructor, but can be altered before
> calling OpenKey.
>
> ...
>
> KEY_ALL_ACCESS combination of KEY_READ, KEY_WRITE, and KEY_CREATE_LINK.
>
> KEY_READ combination of KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS,
>  and KEY_NOTIFY.
> KEY_WRITE combination of KEY_SET_VALUE and KEY_CREATE_SUB_KEY.
>
> KEY_QUERY_VALUE grants permission to query subkey data.
> KEY_ENUMERATE_SUB_KEYS grants permission to enumerate subkeys.
>
> KEY_NOTIFY grants ability to receive change notifications.
>
>
> KEY_SET_VALUE grants permission to set subkey data.
> KEY_CREATE_SUB_KEY grants permission to create subkeys.
> KEY_CREATE_LINK grants permission to create symbolic links.
>
> KEY_EXECUTE restricts permission to read-only access.
>
> Note: Access is ignored by the CreateKey method, which always
> uses KEY_ALL_ACCESS


 
И. Павел ©   (2010-12-04 17:36) [12]


> _Юрий   (04.12.10 01:18) [7]

Судя по коду, reg.OpenKeyReadOnly самовольно меняет свойство Access. Причем на что поменяет - зависит от прав пользователя.

ИМХО лучше сперва установить права самостоятельно и явно, а потом вызвать  reg.OpenKey.


 
Василий Иванович ©   (2010-12-07 18:37) [13]

ОГРОМНОЕ ВСЕМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО.

sniknik ©. - Да. Все оказалось действительно так. reg.KeyExists("Control")

И. Павел © - Устанавливал - резона нет. Нужно только считать параметры, поэтому reg.OpenKeyReadOnly - хватило с головой, а вот reg.OpenKey - даже с выставленными атрибутами недавал хода в эту ветку.

ЕЩЕ РАЗ ОГРОМНОЕ СПАСИБО. ЖИЗНЬ СНОВА ОБРЕТАЕТ КРАСКИ. ;)


 
Сергей М. ©   (2010-12-07 23:13) [14]


> Василий Иванович ©   (04.12.10 11:48) [9]


И не стыдно тебе было напрягать преподобного ЛТ (С) с намеками про столб ?
После [10]-то ?)



Страницы: 1 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1290029388
Юрий
2010-11-18 00:29
2011.02.27
С днем рождения ! 18 ноября 2010 четверг


2-1291306769
Чайник
2010-12-02 19:19
2011.02.27
Вставка в TStringGrid через буфер обмена


3-1253354851
Sergey__
2009-09-19 14:07
2011.02.27
Fbserver


8-1210633567
Simnet_
2008-05-13 03:06
2011.02.27
FMOD изнутри: как представлен звук в памяти?


15-1289770190
Юрий
2010-11-15 00:29
2011.02.27
С днем рождения ! 15 ноября 2010 понедельник