Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизЕще раз про удаление записи в реестре Найти похожие ветки
← →
pavel_guzhanov (2004-12-20 13:48) [0]Уважаемые мастера!
Я уже поднимал этот вопрос, про удаление записи в реестре. Так у меня ничего и не получилось...
Возможно(а правильнее сказать "наверняка"), это получается из-за моего незнания "матчасти", т.е. теории работы с реестром. Поэтому прошу вас не счесть за труд и просвятить меня немного. Я считаю, что для удаления записи из реестра надо:
1. Соединиться с реестром (RegConnectRegistry)
2. Открыть ключ (RegOpenKey)
3. Удалить запись или значение (RegDeleteKey или RegDeleteValue)
Если я не прав, поправьте пожалуйста.
Первые две функции возвращают у меня значение ERROR_SUCCESS, т.е все нормально, последняя же возвращает какое-то другое значение, т.е не срабатывает.
Если я прав в своих рассуждениях, то подскажите пожалуйста, как вызывается функция RegDeleteKey?. Первый параметр - HKEY_LOCAL_MACHINE, а чтто использовать в качестве второго параметра?
Спасибо
← →
Digitman © (2004-12-20 14:25) [1]
> последняя же возвращает какое-то другое значение
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) [2]
> последняя же возвращает какое-то другое значение
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:29) [3]
> чтто использовать в качестве второго параметра?
оносительный путь к ключу, не включающий в себя корень ветки, т.е. то что задано 1-м параметром, как то
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
← →
pavel_guzhanov (2004-12-20 15:19) [4]я вторым параметром указываю
"Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\".
А файл WINERROR.H я почему-то найти не могу
← →
Digitman © (2004-12-20 15:31) [5]нет никакого станд.подключа SystemInfo в подключе Run
← →
pavel_guzhanov (2004-12-20 15:47) [6]Это не стандартный подключ. Этот подключ создан другой моей программой, и теперь мне надо его удалить(((
← →
pavel_guzhanov (2004-12-20 15:48) [7]а значение эта функция возвращает 2
← →
Digitman © (2004-12-20 16:01) [8]
> а значение эта функция возвращает 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 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. Подскажите, что я делаю не правильно
← →
Digitman © (2004-12-20 17:40) [10]зачем ты открываешь ключ
HКLM\Software\Microsoft\Windows\CurrentVersion\Run
если все что тебе нужно - это просто удалить ключ
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo
?
поясни свою глубокую мысль ..
← →
pavel_guzhanov (2004-12-20 17:55) [11]про свою глубокую мысль я писал в самом вопросе: от незнания теории работы с реестром, поэтому и обращаюсь за помощью. Но если я ключ не открываю, все равно не удаляется тот ключ, который мне надо удалить...
← →
Leonid Troyanovsky © (2004-12-20 21:38) [12]
> 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-21 11:44) [13]Ё-моё, неужели так трудно написать всего одну строчку, правильную? Здесь самый посещаемый форум, посвященный delphi, неплохие спецы, бывает, что даются очень даже дельные и разумные советы, но иногда, кроме того, что надо читать msdn ничего добиться нельзя. Я этот вопрос за последние дни задавал дважды, просил, чтобы ответили на простой вопрос :"как это сделать правильно?", получил кучу ответов, но ни в одном не было ни строчки кода, единственной, необходимой. Я понимаю, что проще написать целые петиции, состязаясь в остроумии, чем просто написать одну работающую строчку. Но я то на форум пришел за помощью, и справку я пердварительно прочитал, но видимо что-то недопонял, не работает у меня это дело.
Я, конечно, извиняюсь, если кого-то обидел из тех, кто искренне хотел помочь
← →
BiN © (2004-12-21 14:09) [14]Но я то на форум пришел за помощью, и справку я пердварительно прочитал, но видимо что-то недопонял
"Не смешите мои тапочки" (с)
Win32Check(RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key)=ERROR_SUCCESS);
Win32Check(RegDeleteKey(Key, "Software\Microsoft\Windows\CurrentVersion\Run\SystemInfo\")=ERROR_SUCCESS);
см также SHDeleteKey
← →
BiN © (2004-12-21 14:15) [15]Сорри, корректнее было бы:
dwRes:=RegConnectRegistry(nil, HKEY_LOCAL_MACHINE, Key);
if dwRes<>ERROR_SUCCESS then
raise EOSError.CreateResFmt(@SOSError, [dwRes,
SysErrorMessage(dwRes)]
← →
pavel_guzhanov (2004-12-21 15:10) [16]Спасибо. Еще раз извиняюсь за грубость...
← →
Leonid Troyanovsky © (2004-12-21 15:24) [17]
> 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-22 08:55) [18]Народ, огромное спасибо за помощь!
Все мне подсказывали верно, только я тупил. Щас разобрался, все работает, главное, что я не мог допереть до вот этого:
> А, вообще, судя по тому, что это все-таки Run, то в нем,
> IMHO, живут не ключи, а значения (string value) с именами
> пускаемых экзешников.
> И, возможно, что нужно было RegDeleteValue.
Надеюсь, что теперь у меня с терминологией в реестре проблемы закончатся:))).
Еще раз спасибо всем, кто оказывал посильную помощь
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.052 c