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

Компьютерный форум 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

 

Аватара для 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]


Отправлено: 03:54, 27-02-2016 | #31



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

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


Аватара для opel431

Ветеран


Contributor


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

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


Цитата Painkiller:
Вот я с этим два дня мучаюсь »
Наверное, сообщество авторов (JCL) считает, что лезть в ветку реестра x64 из 32-разрядного приложения, недопустимо! Почему RegSetWOW64AccessMode не работает для RegDeleteKeyTree, пока не пойму.
Можно пробовать применять функции (Wow64DisableWow64FsRedirection и Wow64EnableWow64FsRedirection) но, этот путь, считают небезопасным.

Цитата Painkiller:
Библиотека реально облегчает работу, жаль что не обновляется »
Обновляется каждый день - http://jcl.sourceforge.net/daily/

P.S. - RegSetWOW64AccessMode не работает для RegDeleteKeyTree, так как, открытие ключа предусмотрено только с флагом доступа KEY_ALL_ACCESS!

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


Последний раз редактировалось opel431, 27-02-2016 в 17:29.

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

Отправлено: 16:56, 27-02-2016 | #32


Аватара для opel431

Ветеран


Contributor


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

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


В качестве примера. Под Вашу ответственность!
Отключение перенаправления
Код: Выделить весь код
//========================================================================================
// Отключение перенаправления при работе 32-битного приложения в 64-битной ОС ////////////
//========================================================================================

// результат, определение разрядности ОС 
function IsWow64: Boolean;
type
  TIsWow64Process = function(Handle: Windows.THandle; var Res: Windows.BOOL)
    : Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL;
  IsWow64Process: TIsWow64Process;
begin
  IsWow64Process := Windows.GetProcAddress
    (Windows.GetModuleHandle('kernel32.dll'), 'IsWow64Process');
  if Assigned(IsWow64Process) then
  begin
    if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then
      raise SysUtils.Exception.Create('IsWow64: bad process handle');
    Result := IsWow64Result;
  end
  else
    Result := False;
end;

// результат, отключение/включение перенаправления
function ChangeFSRedirection(bDisable: boolean): boolean;
type
  TWow64DisableWow64FsRedirection = function(Var Wow64FsEnableRedirection
    : LongBool): LongBool; stdcall;
  TWow64EnableWow64FsRedirection = function(var Wow64FsEnableRedirection
    : LongBool): LongBool; stdcall;
var
  hHandle: THandle;
  Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
  Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
  Wow64FsEnableRedirection: LongBool;

begin
  Result := True;

  if not IsWow64 then
    exit;

  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64EnableWow64FsRedirection := GetProcAddress(hHandle,
      'Wow64EnableWow64FsRedirection');
    @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle,
      'Wow64DisableWow64FsRedirection');

    if bDisable then
    begin
      If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and
        (@Wow64DisableWow64FsRedirection <> nil)) Then
        Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
    end;

    if not bDisable then
      If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and
        (@Wow64DisableWow64FsRedirection <> nil)) Then
        Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);

  Except
    Result := False;
  end;
end;

{применение}

// отключаем перенаправление
ChangeFSRedirection(true);

// что-то делаем с файлами или реестром
...
// например, открываем файл в \system32, а не в \SysWOW64 
OpenFile('C:\Windows\system32\einedatei.txt');
...
// включаем перенаправление
ChangeFSRedirection(false);

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

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

Отправлено: 00:56, 28-02-2016 | #33


Аватара для Painkiller

Ветеран


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


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

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


Цитата opel431:
В качестве примера. Под Вашу ответственность! »
Спасибо за пример, сохраню себе на будущее для других целей . В моём случае с библиотекой JEDI мне это не поможет. Т. к. вы сами писали RegSetWOW64AccessMode не работает для RegDeleteKeyTree, так как, открытие ключа предусмотрено только с флагом доступа KEY_ALL_ACCESS!

Цитата opel431:
Обновляется каждый день - http://jcl.sourceforge.net/daily/ »
Обновляется ? Портируется на новые версии delphi только.

-------
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]


Отправлено: 01:06, 28-02-2016 | #34


Аватара для opel431

Ветеран


Contributor


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

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


Цитата Painkiller:
Т. к. вы сами писали RegSetWOW64AccessMode не работает для RegDeleteKeyTree »
Еще раз. Перенаправление и доступность (для 32-разрядного приложения в 64-разрядной среде), не одно и тоже!

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


Отправлено: 01:19, 28-02-2016 | #35


Аватара для Painkiller

Ветеран


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


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

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


Цитата opel431:
Еще раз. Перенаправление и доступность (для 32-разрядного приложения в 64-разрядной среде), не одно и тоже! »
За код конечно спасибо , но он мне ничем не помог , буду использовать свой код и дальше . Видимо лучше его способа нет .

-------
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]


Отправлено: 01:39, 28-02-2016 | #36


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

Ветеран


Contributor


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

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


Цитата opel431:
RegSetWOW64AccessMode не работает для RegDeleteKeyTree »
opel431, RegSetWOW64AccessMode у ТС работает, т.к. 64-разрядный раздел реестра из 32-разрядного приложения находится, RegDeleteKeyTree не удаляет раздел, потому что это обертка над виндовой RegDeleteKey, а она:
Цитата:
The RegDeleteKey function cannot be used to access an alternate registry view.
В игры с KEY_WOW64_64KEY функция RegDeleteKey не играет, нужно использовать RegDeleteKeyEx.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:29, 29-02-2016 | #37


Аватара для opel431

Ветеран


Contributor


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

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


Цитата El Sanchez:
В игры с KEY_WOW64_64KEY функция RegDeleteKey не играет, нужно использовать RegDeleteKeyEx »
Спасибо, но, как Вы сами и заметили
Цитата El Sanchez:
RegDeleteKeyTree не удаляет раздел, потому...»
Что нами и обсуждалось, - применение стандартной функции RegDeleteKeyTree из библиотеки JCL без "умного перенаправления", а не возможности API функций.
Что касается RegDeleteKeyEx, то согласно того-же http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
Код: Выделить весь код
A handle to an open registry key. The access rights of this key do not affect the delete operation. For more information about access rights, see Registry Key Security and Access Rights.
This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function, or it can be one of the following Predefined Keys:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
то можно понимать, что вполне возможно обходится только RegOpenKeyEx. Открывать требуемый ключ и передавать его первым параметром в RegDeleteKey.
Все мы разные! Кому-то нравится осуществлять "мозговой штурм", кто-то ищет проще, кого-то интересует классика.

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


Последний раз редактировалось opel431, 29-02-2016 в 14:51.


Отправлено: 11:45, 29-02-2016 | #38


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

Ветеран


Contributor


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

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


Цитата opel431:
можно вообще обходится только RegOpenKeyEx. Открывать требуемый ключ и передавать его первым параметром в RegDeleteKey. »
opel431, ну получили вы нужный дескриптор от RegOpenKeyEx, ну передали его в RegDeleteKey первым параметром, вторым что будете передавать? При тех параметрах, что передаются в RegDeleteKey в теле RegDeleteKeyTree, в случае ТС должна быть RegDeleteKeyEx.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:07, 29-02-2016 | #39


Аватара для opel431

Ветеран


Contributor


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

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


Цитата El Sanchez:
opel431, ну получили вы нужный дескриптор от RegOpenKeyEx »
Бог ты мой, даже в ссылке указано
Цитата opel431:
This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function »
Ну не поняли друг-друга. Я на "волне" замены примера автора на API функции, где считаю RegCreateKeyEx лишним!

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


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


Отправлено: 02:59, 05-03-2016 | #40



Компьютерный форум 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




 
Переход