Показать полную графическую версию : [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )
Painkiller
27-02-2016, 02:04
У меня в XE удаляет. »
http://i4.imageban.ru/out/2016/02/27/74e7309ed7cf145016bd97413485b328.png
Я подправил код, попробуйте!
Painkiller
27-02-2016, 02:35
opel431, Тоже самое , ключ не найден . Даже попросил знакомого у себя на компе проверить на x64 редакции свежо-установленной и тоже самое как у меня . На x86 проблем нет . Может дело в Embarcadero RAD Studio XE6? Хотя ...
Тоже самое , ключ не найден »Вы уверены? Ведь из приложения на платформе x64 следует смотреть в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount, а на платформе x86 в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount
Что притихли, ответ ждать или на потом?
Painkiller
27-02-2016, 02:48
Вы уверены? Ведь в приложении на платформе x64 следует смотреть в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount, а на платформе x86 в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount »
Уверен. Я на x64 смотрю ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount. Она мне и нужна . На x86 таже ветка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount удаляется без проблем
Сюда мы не смотрим HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount
Да ладно , не работает , дык не работает . Буду по старинке =) Всё равно признателен, что откликнулись
Сюда мы не смотрим HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount »Сюда мы не смотрим, если приложение на платформе x86 работает в системе x86! Если это приложение работает в системе x64, то ключи (создает, ищет, удаляет и....) в Wow6432Node
Painkiller
27-02-2016, 02:56
Если это приложение работает в системе x64, то ключи (создает, ищет, удаляет и....) в Wow6432Node »
Я это понимаю . Я пытаюсь добиться, чтобы приложение 32 x работая в системе x64, удаляла ключи из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount, а не HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount
По старинке с помощью этого кода всё работает :
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;
Я пытаюсь добиться, чтобы приложение 32 x работая в системе x64, удаляла ключи из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WIMMount, а не HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WIMMount »Тогда попробуйте отключать перенаправление - RegDisableReflectionKey. В одном из приложений (tweaks) применял, нужно покопаться, или посмотрите в MSDN.
Painkiller
27-02-2016, 03:44
Тогда нужно отключать перенаправление - RegDisableReflectionKey. В одном из приложений (tweaks) применял, нужно покопаться, или посмотрите в MSDN. »
А разве RegSetWOW64AccessMode не переключает направления ?
А разве RegSetWOW64AccessMode не переключает направления ? »А вот не работает код ....хотя ранее я его и применял! Буду смотреть в чем дело.
Painkiller
27-02-2016, 03:54
А вот не работает....хотя ранее я его и применял! Буду смотреть в чем дело. »
Вот я с этим два дня мучаюсь . Библиотека реально облегчает работу, жаль что не обновляется
Вот я с этим два дня мучаюсь »Наверное, сообщество авторов (JCL) считает, что лезть в ветку реестра x64 из 32-разрядного приложения, недопустимо! Почему RegSetWOW64AccessMode не работает для RegDeleteKeyTree, пока не пойму.
Можно пробовать применять функции (Wow64DisableWow64FsRedirection и Wow64EnableWow64FsRedirection) но, этот путь, считают небезопасным.
Библиотека реально облегчает работу, жаль что не обновляется »Обновляется каждый день - http://jcl.sourceforge.net/daily/
P.S. - RegSetWOW64AccessMode не работает для RegDeleteKeyTree, так как, открытие ключа предусмотрено только с флагом доступа KEY_ALL_ACCESS!
В качестве примера. Под Вашу ответственность!
//========================================================================================
// Отключение перенаправления при работе 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);
Painkiller
28-02-2016, 01:06
В качестве примера. Под Вашу ответственность! »
Спасибо за пример, сохраню себе на будущее для других целей . В моём случае с библиотекой JEDI мне это не поможет. Т. к. вы сами писали RegSetWOW64AccessMode не работает для RegDeleteKeyTree, так как, открытие ключа предусмотрено только с флагом доступа KEY_ALL_ACCESS!
Обновляется каждый день - http://jcl.sourceforge.net/daily/ »
Обновляется ? Портируется на новые версии delphi только.
Т. к. вы сами писали RegSetWOW64AccessMode не работает для RegDeleteKeyTree »Еще раз. Перенаправление и доступность (для 32-разрядного приложения в 64-разрядной среде), не одно и тоже!
Painkiller
28-02-2016, 01:39
Еще раз. Перенаправление и доступность (для 32-разрядного приложения в 64-разрядной среде), не одно и тоже! »
За код конечно спасибо , но он мне ничем не помог , буду использовать свой код и дальше . Видимо лучше его способа нет .
El Sanchez
29-02-2016, 09:29
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.
В игры с KEY_WOW64_64KEY функция RegDeleteKey не играет, нужно использовать RegDeleteKeyEx »Спасибо, но, как Вы сами и заметилиRegDeleteKeyTree не удаляет раздел, потому...»Что нами и обсуждалось, - применение стандартной функции RegDeleteKeyTree из библиотеки JCL без "умного перенаправления", а не возможности API функций.
Что касается RegDeleteKeyEx, то согласно того-же http://msdn.microsoft.com/en-us/library/ms724845%28v=VS.85%29.aspxA 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.
Все мы разные! Кому-то нравится осуществлять "мозговой штурм", кто-то ищет проще, кого-то интересует классика.
El Sanchez
29-02-2016, 15:07
можно вообще обходится только RegOpenKeyEx. Открывать требуемый ключ и передавать его первым параметром в RegDeleteKey. »
opel431, ну получили вы нужный дескриптор от RegOpenKeyEx, ну передали его в RegDeleteKey первым параметром, вторым что будете передавать? При тех параметрах, что передаются в RegDeleteKey в теле RegDeleteKeyTree, в случае ТС должна быть RegDeleteKeyEx.
opel431, ну получили вы нужный дескриптор от RegOpenKeyEx »Бог ты мой, даже в ссылке указаноThis handle is returned by the RegCreateKeyEx or RegOpenKeyEx function » Ну не поняли друг-друга. Я на "волне" замены примера автора на API функции, где считаю RegCreateKeyEx лишним!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.