Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Ответить
Настройки темы
Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Изменения
Автор: Painkiller
Дата: 26-02-2016
Привет всем ! Столкнулся с такой проблемой . Нужно удалить ключ реестра со всеми подключами.
Код: Выделить весь код
HKEY_LOCAL_MACHINE\Software\Microsoft\WIMMount
Проблема на x64 системе , а у меня x32 приложения . Соответственно моя программа ищет этот в ключе Wow6432Node. Решения я нашёл не используя библиотеку JEDI так:
Скрытый текст

Код: Выделить весь код
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create();
if IsWindows64=true then begin
Reg.Access := $100 or KEY_ALL_ACCESS;
end;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('\Software\Microsoft\WIMMount') then
Reg.DeleteKey('Software\Microsoft\WIMMount');
finally
Reg.Free;
end;end;

Всё работает и удаляется . Но хотелось бы обойтись средствами библиотеки JEDI
Скрытый текст

Набросал код :
Код: Выделить весь код
procedure TForm1.Button2Click(Sender: TObject);
var
RootKey: HKEY;
PathKEY:String;
 begin
if IsWindows64=true then begin
RegSetWOW64AccessMode(ra64Key);
end;
RootKey := HKEY_LOCAL_MACHINE;
PathKEY:='Software\Microsoft\WIMMount';
if not RegKeyExists (RootKey,PathKEY) then begin
Memo1.Lines.Add('- [ Ошибка ] Ключ не найден')
end else begin
Memo1.Lines.Add('[ ОК ] Ключ найден');
if not RegDeleteKeyTree (RootKey,PathKEY)then   begin
Memo1.Lines.Add('[ Ошибка ] Ключ не удалён')
end else begin
Memo1.Lines.Add('[ ОК ] Ключ удалён');
end;
end;
end;
end.

Ключ находит, но не удаляет =((( Что нужно ещё добавить ??? Помогите, плиз!

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 23:47, 24-02-2016

 

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1273
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата opel431:
где считаю RegDeleteKeyEx лишним! »
opel431, еще раз, я не считаю RegDeleteKeyEx лишним при тех параметрах, что передаются в RegDeleteKey в теле RegDeleteKeyTree. В текущей реализации RegDeleteKeyTree все сводится к вызову RegDeleteKey с одним и тем же первым параметром RootKey, указанным пользователем, а это одна из констант (HKEY_*). Так вот при таком первом параметре в случае ТС RegDeleteKey обломается, а RegDeleteKeyEx нет. Поэтому либо оставить RootKey в покое и использовать RegDeleteKeyEx в случае, если запуск производится на 64-разрядной системе, либо, как вы предложили, в RegDeleteKey использовать дескриптор RegKey, полученный от InternalRegOpenKeyEx. Предложить-предложили, только ж надо еще и код поменять, чтобы все заработало, RegKey участвует в перечислении подразделов, но не в удалении.
Вариант №1. С использованием RegDeleteKeyEx

Код: Выделить весь код
function RegDeleteKeyTree(const RootKey: DelphiHKEY; const Key: string): Boolean;
var
  RegKey: HKEY;
  I: DWORD;
  Size: DWORD;
  NumSubKeys: DWORD;
  MaxSubKeyLen: DWORD;
  KeyName: string;
begin
  RegKey := 0;
  Result := InternalRegOpenKeyEx(RootKey, RelativeKey(RootKey, PChar(Key)), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS;
  if Result then
  begin
    RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil);
    if NumSubKeys <> 0 then
      for I := NumSubKeys - 1 downto 0 do
      begin
        Size := MaxSubKeyLen+1;
        SetLength(KeyName, Size);
        RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil);
        SetLength(KeyName, StrLen(PChar(KeyName)));
        Result := RegDeleteKeyTree(RootKey, Key + RegKeyDelimiter + KeyName);
        if not Result then
          Break;
      end;
    RegCloseKey(RegKey);
    if Result then
      if IsWindows64 then
        Result := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}Windows.RegDeleteKeyEx(RootKey, RelativeKey(RootKey, PChar(Key)), GetWOW64AccessMode(KEY_ALL_ACCESS), 0) = ERROR_SUCCESS
      else
        Result := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}Windows.RegDeleteKey(RootKey, RelativeKey(RootKey, PChar(Key))) = ERROR_SUCCESS;
  end
  else
    WriteError(RootKey, Key);
end;

Вариант №2. С использованием RegDeleteKey и RegKey в качестве первого параметра

Код: Выделить весь код
function RegDeleteKeyTree(const RootKey: DelphiHKEY; const Key: string): Boolean;
var
  RegKey: HKEY;
  I: DWORD;
  Size: DWORD;
  NumSubKeys: DWORD;
  MaxSubKeyLen: DWORD;
  KeyName: string;
begin
  RegKey := 0;
  Result := InternalRegOpenKeyEx(RootKey, RelativeKey(RootKey, PChar(Key)), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS;
  if Result then
  begin
    RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil);
    if NumSubKeys <> 0 then
      for I := NumSubKeys - 1 downto 0 do
      begin
        Size := MaxSubKeyLen+1;
        SetLength(KeyName, Size);
        RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil);
        SetLength(KeyName, StrLen(PChar(KeyName)));
        Result := RegDeleteKeyTree(RegKey, KeyName);
        if not Result then
          Break;
      end;
    if Result then
      Result := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}Windows.RegDeleteKey(RegKey, PChar('')) = ERROR_SUCCESS;
    RegCloseKey(RegKey);
  end
  else
    WriteError(RootKey, Key);
end;

Вариант №3. С использованием SHDeleteKey, в которой рекурсия уже реализована

Код: Выделить весь код
uses
  ShLwApi;

function RegDeleteKeyTree(const RootKey: HKEY; const Key: string): Boolean;
var
  RegKey: HKEY;
begin
  RegKey := 0;
  Result := InternalRegOpenKeyEx(RootKey, RelativeKey(RootKey, PChar(Key)), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS;
  if Result then
  begin
    Result := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}ShLwApi.SHDeleteKey(RegKey, PChar('')) = ERROR_SUCCESS;
    RegCloseKey(RegKey);
  end
  else
    WriteError(RootKey, Key);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:43, 06-03-2016 | #41



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


1. Дружище, искреннее спасибо за развернутый пример.
2. Думаю, что подмена моего ответа случайна
Цитата opel431:
где считаю RegCreateKeyEx лишним! »
...
Цитата El Sanchez:
где считаю RegDeleteKeyEx лишним! » »
тем более, мы не обсуждали API, мы дискутировали на тему, почему имеющая функция RegDeleteKeyTree из пакета JCL "не лезет" в ветку HKLM из 32-битного процесса. И ответ я дал
Цитата opel431:
Наверное, сообщество авторов (JCL) считает, что лезть в ветку реестра x64 из 32-разрядного приложения, недопустимо! »
3. Свои решения есть в модуле CmnFunc2.pas{ Inno Setup, Jordan Russell, Common non-VCL functions }здесь http://www.rhyous.com/2011/01/24/how...or-vice-versa/, но соглашусь, Ваше решение с SHDeleteKey, элегантно!

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 06-03-2016 в 18:35.


Отправлено: 14:01, 06-03-2016 | #42


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, El Sanchez, просветите??? Я попробовал все функции от El Sanchez и получил такой же самый результат . Функции лезут не в ту ветку реестра

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 16:03, 06-03-2016 | #43


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z reestr_64.7z
(82.7 Kb, 6 просмотров)

Цитата Painkiller:
просветите??? »
Мне удобней сбросить готовый проект, основанный на решении выцарапанного из модуля CmnFunc2.pas
Цитата Painkiller:
Функции лезут не в ту ветку реестра »
Не вдаваясь в подробности кода (KEY_WOW64_64KEY = $0100) + Права + манифест! Ну, и чтобы понять вокруг чего идет речь, просто откройте исходный код - JCLRegistry.pas

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 06-03-2016 в 17:58.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:14, 06-03-2016 | #44


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, заработало, правда слишком много кода Тема можно считать решенной

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 06-03-2016 в 17:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:53, 06-03-2016 | #45


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата Painkiller:
правда слишком много кода »
Конечно, визуально "много", так как, применяя функции из JCL, от Вас скрыто в десятки раз больше, строк кода! Возьмите модуль JCLRegistry.pas (Сколько строк в модуле? 2142!) + посмотрите, какие модули он еще требует! Берите из хорошего кода только то, что Вам нужно!

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 06-03-2016 в 18:12.


Отправлено: 18:07, 06-03-2016 | #46


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Цитата opel431:
Берите из хорошего кода только то, что Вам нужно! »
Я как-то с эти не замарачиваюсь, просто подключаю модуль и использую .

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 18:16, 06-03-2016 | #47


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1273
Благодарности: 1030

Профиль | Отправить PM | Цитировать



Еще позанудствую.
Цитата opel431:
тем более, мы не обсуждали API, мы дискутировали на тему, почему имеющая функция RegDeleteKeyTree из пакета JCL "не лезет" в ветку HKLM из 32-битного процесса. И ответ я дал
Цитата opel431:
Наверное, сообщество авторов (JCL) считает, что лезть в ветку реестра x64 из 32-разрядного приложения, недопустимо!
opel431, неа, тип TJclRegWOW64Access и функция GetWOW64AccessMode говорят мне о том, что авторы таки лезут, но тупо ошиблись в реализации. Да, с удалением через RegDeleteKeyTree 32-разрядного раздела из 64-разрядного приложения у них тоже проблемы.
Цитата opel431:
Не вдаваясь в подробности кода (KEY_WOW64_64KEY = $0100) + Права + манифест! »
opel431, повышение привилегий лишнее, достаточно манифеста.

Отправлено: 09:57, 09-03-2016 | #48


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
повышение привилегий лишнее, достаточно манифеста. »
Здесь вы правы, но много других плюсов в этом .
Цитата El Sanchez:
Да, с удалением через RegDeleteKeyTree 32-разрядного раздела из 64-разрядного приложения у них тоже проблемы. »
Не заметил, из под x64 приложения всё удаляется

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 09-03-2016 в 22:33.


Отправлено: 20:34, 09-03-2016 | #49


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
Еще позанудствую »
Для общего блага не мешает!

Цитата Painkiller:
Здесь вы правы, но много других плюсов в этом »
Наверное!
1. Если в приложении нужна поддержка визуальных стилей, а повышение прав, только в случаях, когда пользователь этого затребует - выполняя определенные действия над защищенными файлами. Иногда нет необходимости предоставлять права в манифесте.
2. Запрашивать и выгружать можно определенные права, а также проверять их наличие и доступность.

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 10-03-2016 в 00:02.


Отправлено: 23:01, 09-03-2016 | #50



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2008 - Вопрос по программе для открытия рисунков по умолчанию flower Windows Server 2008/2008 R2 4 18-10-2010 17:22
Прочее - вопрос по загрузке образов cd/dvd дисков по сети andi_filon Общий по Linux 4 21-08-2009 14:48
Вопрос по платформам обработки данных и еще по всяким непонятным словам :) koresaram Хочу все знать 8 19-02-2009 18:26
Jedi Concentrate (Концентрируемся на окнах) yurfed Программное обеспечение Windows 0 22-12-2007 10:05
Star Wars: Jedi Knight 2 Mihan Игры 8 03-11-2003 11:50




 
Переход