Войти

Показать полную графическую версию : [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )


Страниц : 1 2 [3]

El Sanchez
06-03-2016, 12:43
где считаю RegDeleteKeyEx лишним! »
opel431, еще раз, я не считаю RegDeleteKeyEx лишним при тех параметрах, что передаются в RegDeleteKey в теле RegDeleteKeyTree. В текущей реализации RegDeleteKeyTree все сводится к вызову RegDeleteKey с одним и тем же первым параметром RootKey, указанным пользователем, а это одна из констант (HKEY_*). Так вот при таком первом параметре в случае ТС RegDeleteKey обломается, а RegDeleteKeyEx нет. Поэтому либо оставить RootKey в покое и использовать RegDeleteKeyEx в случае, если запуск производится на 64-разрядной системе, либо, как вы предложили, в RegDeleteKey использовать дескриптор RegKey, полученный от InternalRegOpenKeyEx. Предложить-предложили, только ж надо еще и код поменять, чтобы все заработало, 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(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;




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;




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;

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

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

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

Painkiller
06-03-2016, 17:53
opel431, заработало, правда слишком много кода =) Тема можно считать решенной

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

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

El Sanchez
09-03-2016, 09:57
Еще позанудствую.
тем более, мы не обсуждали API, мы дискутировали на тему, почему имеющая функция RegDeleteKeyTree из пакета JCL "не лезет" в ветку HKLM из 32-битного процесса. И ответ я дал
Цитата opel431:
Наверное, сообщество авторов (JCL) считает, что лезть в ветку реестра x64 из 32-разрядного приложения, недопустимо!

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

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

opel431
09-03-2016, 23:01
Еще позанудствую »Для общего блага не мешает!

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




© OSzone.net 2001-2012