Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу удалить ключ реестра


Gu ©   (2011-06-26 08:06:00) 

Win7x64,Delphi Xe,учетная запись администратора.

Создаем ключ:

...
var reg1:tregistry;key:string;
begin
key:='SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\ {0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}';
reg1:=tregistry.Create;
reg1.RootKey:=HKEY_LOCAL_MACHINE;
reg1.Access:=KEY_ALL_ACCESS;
if reg1.Openkey(key,true)=true then showmessage('ok');
reg1.Closekey;
reg1.free;
end;

Создает пустой ключ нормально, через regedit его видно. Удаляем:

...
var reg1:tregistry;key:string;
begin
key:='SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\ {0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}';
reg1:=tregistry.Create;
reg1.RootKey:=HKEY_LOCAL_MACHINE;
reg1.Access:=KEY_WOW64_64KEY + KEY_ALL_ACCESS;
if reg1.KeyExists(key)=true then showmessage('Key found');
if reg1.DeleteKey(key)=true then showmessage('ok');
//showmessage(inttostr(getlasterror));
reg1.free;
end;

Не удаляет и ошибок нет. Просто не отрабатывает DeleteKey. Через regedit ключ удалить можно. После создания смотрю права, на этот ключ через regedit, все ок, наследуются от веток выше, для учетки админа, права есть на удаление. Что может мешать?
Читал: http://www.programmersforum.ru/showthread.php?t=80984, константа KEY_WOW64_64KEY правильно определена и ключ создает в нужном (не в wow6432node, a там где key:='..) месте. Может кто у себя потестит на x64?


Gu   (2011-06-26 08:52:00) [1]

тэкс, заработало так:

function RegDelKey(RootKey: HKEY; Name: String): boolean;
function LastPos(Needle: Char; Haystack: String): integer;
begin
 for Result := Length(Haystack) downto 1 do
   if Haystack[Result] = Needle then
     Break;
end;
var
 SubKey: String;  n: integer;  hTemp: HKEY;
begin
 Result := False;
 n := LastPos('\', Name);
 if n > 0 then
 begin
   SubKey := Copy(Name, 1, n - 1);
   if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WOW64_64KEY + KEY_ALL_ACCESS, hTemp) = ERROR_SUCCESS then
   begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     Result := (RegDeleteKey(hTemp, PChar(SubKey)) = ERROR_SUCCESS);
     RegCloseKey(hTemp);
   end;
 end;
end;

прямо как с непустыми папками


Gu   (2011-06-26 08:24:00) [2]

RegDeleteKey тоже не хочет удалять


Gu   (2011-06-26 08:16:00) [3]

ага, если заменить //showmessage(inttostr(getlasterror)); на showmessage(reg1.LastErrorMsg); показывает "не найден", и куда он девается и почему тогда KeyExists отрабатывает норм?


Gu   (2011-06-26 08:07:00) [4]

в создании ключика тоже reg1.Access:=KEY_WOW64_64KEY + KEY_ALL_ACCESS; забыл дописать


Наверх

Титульная страница Поиск, карта сайта Написать письмо