2016-02-08 5 views
2

Я хочу перечислить USB идентификаторов VID из реестра, и я написал следующий код: DelphiПочему мой код не находит ключи реестра?

procedure FindUSBvids(VIDs: TStrings); 
var 
    Reg1: TRegistry; 
begin 
    Reg1 := TRegistry.Create; 
    try 
    Reg1.RootKey := HKEY_LOCAL_MACHINE; 
    Reg1.OpenKey('System\CurrentControlSet\Enum\USB', False); 
    Reg1.GetKeyNames(VIDs); 
    finally 
    Reg1.Free; 
    end; 
end; 

procedure TForm1.Button6Click(Sender: TObject); 
    FindUSBvids(Memo2.Lines); 
end; 

К сожалению, Memo остается пустым. Я трижды проверил ключ, он существует и имеет несколько десятков подключей. Что я делаю не так?

(Примечание.. Я не уверен, что это правильный способ найти USB-идентификаторы VID, но это не точка Это просто, что я озадачен, почему код не дает никакого результата)

+3

Small nitpick, используйте CurrentControlSet вместо ControlSet001 ... – whosrdaddy

+0

@whosrdaddy Я думаю, что это зависит от того, что делает OP, не так ли? Если проблемы с отладкой запуска (например), возможно, захотят сравнить текущие с последними известными благами ... конечно, никогда не следует * писать * на 001 или 002, но чтение из них - это правильная вещь, которую нужно делать, время от времени. –

+0

@whosrdaddy Это звучит как хороший совет, а не придирание. Благодаря! –

ответ

4

Вы запрашиваете доступ к записи в раздел реестра. Используйте OpenKeyReadOnly вместо OpenKey.

+0

Альтернативно, и, возможно, минимально безопасно, 'Reg1: = TRegistry.Create (KEY_READ);' –

+0

Спасибо Дэвиду, который его решает. Я уже переписал ваш первый ответ (который вы удалили, но дополнительный параметр действительно не нужен. Спасибо еще раз. –

+0

Да, я ошибся сперва. Я думал, что ключ перенаправлен, но это не так. –

1

Вы используете приложение с повышенными правами доступа в качестве администратора или обычного пользователя.

Когда вы используете OpenKey Delphi по умолчанию пытается получить доступ к этому разделу реестра, используя доступ для чтения и записи.

Теперь в Windows XP это будет нормально, но в Windows Vista и новее это может быть заблокировано UAC, особенно если вы пытаетесь прочитать содержимое реестра с HKEY_LOCAL_MACHINE, потому что эта часть реестра защищена и требует повышенных привилегий быть изменен.

Таким образом, вам нужно либо запустить приложение с правами администратора, либо изменить свойство Access на `KEY_READ '. Я бы рекомендовал использовать пену, если вы только перечисляете USB-устройства.

+3

Это тоже не нормально. Там также существует стандартный пользователь. Это было не так очевидно, когда люди ошибались. –

Смежные вопросы