Форум: "Начинающим";
Текущий архив: 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.003 c