Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Василий Иванович ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1291585874
Ghost del vonte
2010-12-06 00:51
2011.02.27
Проверка слов


2-1291283179
Великий
2010-12-02 12:46
2011.02.27
Посимвольное считывание из Edit а


2-1291800746
cross
2010-12-08 12:32
2011.02.27
Доступ к списку (private) класса TA из класса TB содержащего TA


4-1245770042
lexik
2009-06-23 19:14
2011.02.27
Иконка в Tray без окна. (Без VCL)


15-1290029388
Юрий
2010-11-18 00:29
2011.02.27
С днем рождения ! 18 ноября 2010 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский