![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз про удаление записи в реестре [D7, Win2k, WinXP]
pavel_guzhanov © (2004-12-20 13:48:00)Уважаемые мастера!
Я уже поднимал этот вопрос, про удаление записи в реестре. Так у меня ничего и не получилось...
Возможно(а правильнее сказать "наверняка"), это получается из-за моего незнания "матчасти", т.е. теории работы с реестром. Поэтому прошу вас не счесть за труд и просвятить меня немного. Я считаю, что для удаления записи из реестра надо:
1. Соединиться с реестром (RegConnectRegistry)
2. Открыть ключ (RegOpenKey)
3. Удалить запись или значение (RegDeleteKey или RegDeleteValue)
Если я не прав, поправьте пожалуйста.
Первые две функции возвращают у меня значение ERROR_SUCCESS, т.е все нормально, последняя же возвращает какое-то другое значение, т.е не срабатывает.
Если я прав в своих рассуждениях, то подскажите пожалуйста, как вызывается функция RegDeleteKey?. Первый параметр - HKEY_LOCAL_MACHINE, а чтто использовать в качестве второго параметра?
Спасибо
pavel_guzhanov (2004-12-22 08:55:00) [1]Народ, огромное спасибо за помощь!
Все мне подсказывали верно, только я тупил. Щас разобрался, все работает, главное, что я не мог допереть до вот этого:
> А, вообще, судя по тому, что это все-таки Run, то в нем,
> IMHO, живут не ключи, а значения (string value) с именами
> пускаемых экзешников.
> И, возможно, что нужно было RegDeleteValue.
Надеюсь, что теперь у меня с терминологией в реестре проблемы закончатся:))).
Еще раз спасибо всем, кто оказывал посильную помощь
Leonid Troyanovsky (2004-12-21 15:24:00) [2]
> pavel_guzhanov (21.12.04 11:44) [13]
> что проще написать целые петиции, состязаясь в остроумии,
> чем просто написать одну работающую строчку. Но я то на
> форум пришел за помощью, и справку я пердварительно прочитал,
Что непонятно - то и уточняй.
Спросили, какие ошибки - я ответил.
Что я посоветовал неправильно?
Что я посоветовал из того, чего нет в msdn.
Где ты усмотрел состязания?
> но видимо что-то недопонял, не работает у меня это дело.
ЧТО у тебя не работает?
Два дня вполне достаточно для внятного изложения.
> Я, конечно, извиняюсь, если кого-то обидел из тех, кто искренне
> хотел помочь
Ну-ну.
Я добавляю ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SystemInfo\
Затем делаю
procedure TForm1.Button1Click(Sender: TObject);
begin
RegDeleteKey(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\');
end;
И, о чудо, ключ удаляется (ясное дело, на этой машине
я имею права на модификацию этой ветви реестра).
А, вообще, судя по тому, что это все-таки Run, то в нем,
IMHO, живут не ключи, а значения (string value) с именами
пускаемых экзешников.
И, возможно, что нужно было RegDeleteValue.
Но, рассказывать про это я не буду.
Потому как не уверен, что это так, кроме того,
оно подробно расписано в msdn, и, наконец,
я утомился уже на ключах.
--
С уважением, LVT.
pavel_guzhanov (2004-12-21 15:10:00) [3]Спасибо. Еще раз извиняюсь за грубость...
BiN (2004-12-21 14:15:00) [4]Сорри, корректнее было бы:
dwRes:=RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key);
if dwRes<>ERROR_SUCCESS then
raise EOSError.CreateResFmt(@SOSError, [dwRes,
SysErrorMessage(dwRes)]
BiN (2004-12-21 14:09:00) [5]Но я то на форум пришел за помощью, и справку я пердварительно прочитал, но видимо что-то недопонял
"Не смешите мои тапочки" (с)
Win32Check(RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key)=ERROR_SUCCESS);
Win32Check(RegDeleteKey( Key, 'Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\')=ERROR_SUCCESS);
см также SHDeleteKey
pavel_guzhanov (2004-12-21 11:44:00) [6]Ё-моё, неужели так трудно написать всего одну строчку, правильную? Здесь самый посещаемый форум, посвященный delphi, неплохие спецы, бывает, что даются очень даже дельные и разумные советы, но иногда, кроме того, что надо читать msdn ничего добиться нельзя. Я этот вопрос за последние дни задавал дважды, просил, чтобы ответили на простой вопрос :"как это сделать правильно?", получил кучу ответов, но ни в одном не было ни строчки кода, единственной, необходимой. Я понимаю, что проще написать целые петиции, состязаясь в остроумии, чем просто написать одну работающую строчку. Но я то на форум пришел за помощью, и справку я пердварительно прочитал, но видимо что-то недопонял, не работает у меня это дело.
Я, конечно, извиняюсь, если кого-то обидел из тех, кто искренне хотел помочь
Leonid Troyanovsky (2004-12-20 21:38:00) [7]
> pavel_guzhanov (20.12.04 16:50) [9]
> Ну а все-таки, я делаю вот так:
> RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key);
> RegOpenKey(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Run',
> key);
> RegDeleteKey(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\')
> В результате запись не удаляется. Я знаю, что проблема в
> RegDeleteKey. Подскажите, что я делаю не правильно
Во-первых, ты не делаешь Win32Check(.. = ERROR_SUCCESS);
Во-вторых, при удалении RegDeleteKey нужен ключ,
полученный от RegConnectRegistry (хотя, видимо,
имелся ввиду локальный компьютер, а значит RegConnectRegistry
и вовсе не нужен)
В-третьих, RegDeleteKey не удаляет ключи, содержащие субключи.
В-четвертых, ключи открывают RegOpenKeyEx и т.д.
Короче, читать msdn до просветления.
И, вообще, почему не TRegistry ?
--
С уважением, LVT.
pavel_guzhanov (2004-12-20 17:55:00) [8]про свою глубокую мысль я писал в самом вопросе: от незнания теории работы с реестром, поэтому и обращаюсь за помощью. Но если я ключ не открываю, все равно не удаляется тот ключ, который мне надо удалить...
Digitman (2004-12-20 17:40:00) [9]зачем ты открываешьключ
HКLM\Software\Microsoft\Windows\CurrentVersion\Run
если все что тебе нужно - это просто удалить ключ
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo
?
поясни свою глубокую мысль ..
pavel_guzhanov (2004-12-20 16:50:00) [10]Ну а все-таки, я делаю вот так:
RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key);
RegOpenKey(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Run', key);
RegDeleteKey(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\')
В результате запись не удаляется. Я знаю, что проблема в RegDeleteKey. Подскажите, что я делаю не правильно
Digitman (2004-12-20 16:01:00) [11]
> а значение эта функция возвращает 2
фрагмент файла winerror.h для приведенного кода отказа :
//
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
// The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND 2L
pavel_guzhanov (2004-12-20 15:48:00) [12]а значение эта функция возвращает 2
pavel_guzhanov (2004-12-20 15:47:00) [13]Это не стандартный подключ. Этот подключ создан другой моей программой, и теперь мне надо его удалить(((
Digitman (2004-12-20 15:31:00) [14]нет никакого станд.подключа SystemInfo в подключе Run
pavel_guzhanov (2004-12-20 15:19:00) [15]я вторым параметром указываю
'Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\'.
А файл WINERROR.H я почему-то найти не могу
Digitman (2004-12-20 14:29:00) [16]
> чтто использовать в качестве второго параметра?
оносительный путь к ключу, не включающий в себя корень ветки, т.е. то что задано 1-м параметром, как то
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Digitman (2004-12-20 14:25:00) [17]
> последняя же возвращает какое-то другое значение
If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
Digitman (2004-12-20 14:25:00) [18]
> последняя же возвращает какое-то другое значение
If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.