|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry ) |
|
Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )
|
Ветеран Сообщения: 1158 |
Привет всем ! Столкнулся с такой проблемой . Нужно удалить ключ реестра со всеми подключами.
Проблема на 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. Ключ находит, но не удаляет =((( Что нужно ещё добавить ??? Помогите, плиз! |
|
------- Отправлено: 23:47, 24-02-2016 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 02:53, 26-02-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать opel431, добавил ваш код :
Скрытый текст
uses JclSecurity,JclRegistry,.... .......................... procedure TForm1.Button2Click(Sender: TObject); var RootKey: HKEY; PathKEY:String; begin RegSetWOW64AccessMode(raNative); RootKey := HKEY_LOCAL_MACHINE; PathKEY:='Software\Microsoft\WIMMount\Mounted Images'; if not RegKeyExists (RootKey,PathKEY) then begin RaiseLastOSError; Memo1.Lines.Add('[ Ошибка [ '+ SysErrorMessage ( GetLastError )+' ] Ключ не найден') ; exit end else begin Memo1.Lines.Add('[ ОК ] Ключ найден'); if not RegDeleteKeyTree (RootKey,PathKEY)then begin RaiseLastOSError; Memo1.Lines.Add('[ Ошибка [ '+ SysErrorMessage ( GetLastError )+' ] Ключ не удалён'); exit end else begin Memo1.Lines.Add('[ ОК ] Ключ удалён'); end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if (CheckWin32Version(6, 0)) then begin if IsPrivilegeEnabled('SeBackupPrivilege') then EnableProcessPrivilege(False, 'SeBackupPrivilege'); if IsPrivilegeEnabled('SeRestorePrivilege') then EnableProcessPrivilege(False, 'SeRestorePrivilege'); end; end; procedure TForm1.FormCreate(Sender: TObject); begin if (CheckWin32Version(6, 0)) then begin if not IsPrivilegeEnabled('SeBackupPrivilege') then EnableProcessPrivilege(True, 'SeBackupPrivilege'); if not IsPrivilegeEnabled('SeRestorePrivilege') then EnableProcessPrivilege(True, 'SeRestorePrivilege'); end; end; end. При нажатии кнопки Button2 выскакивает ошибка Скрытый текст
![]() Windows 7 Максимальная x64 установлена Убрал RaiseLastOSError ошибка ушла , ключ находит, но ключ не удаляет =((. Хочу заметить то что если я делаю x64 приложения , то ключ удаляется Пробовал использовать manifest Скрытый текст
с <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> Результат не дал =( |
------- Последний раз редактировалось Painkiller, 26-02-2016 в 09:28. Отправлено: 08:29, 26-02-2016 | #3 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать В целом, сообщение "A call to an OS function failed" вызывается из SysUtils, когда Win32Check или RaiseLastOSError не находит соответствующее сообщение об ошибке в модуле.
|
------- Последний раз редактировалось opel431, 26-02-2016 в 09:56. Отправлено: 09:38, 26-02-2016 | #4 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать opel431, извиняюсь, поправил код.
procedure TForm1.Button2Click(Sender: TObject); var RootKey: HKEY; PathKEY:String; begin RegSetWOW64AccessMode(raNative); RootKey := HKEY_LOCAL_MACHINE; PathKEY:='Software\Microsoft\WIMMount'; if not RegKeyExists (RootKey,PathKEY) then begin Memo1.Lines.Add('[ '+ SysErrorMessage ( GetLastError )+' ] Ключ не найден') ; exit end else begin Memo1.Lines.Add('[ '+ SysErrorMessage ( GetLastError )+' ] Ключ найден') ; if not RegDeleteKeyTree (RootKey,PathKEY)then begin Memo1.Lines.Add('['+ SysErrorMessage ( GetLastError )+' ] Ключ не удалён'); exit end else begin Memo1.Lines.Add('['+ SysErrorMessage ( GetLastError )+' ] Ключ удалён'); end; end; end; Скрытый текст
![]() |
|
------- Последний раз редактировалось Painkiller, 26-02-2016 в 10:55. Отправлено: 09:48, 26-02-2016 | #5 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Смотря, что Вам нужно!
RegDeleteKeyTree - удаляет подключи, для сбора всех ='RegKeyName' нужно будет формировать список и удалять по списку (RegGetKeyNames) RegDeleteEntry - удаляет ключ |
------- Отправлено: 10:07, 26-02-2016 | #6 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать Цитата opel431:
Разницы нет где располагать RegSetWOW64AccessMode(raNative). Так как без его ключ вообще не видит. Значит RegSetWOW64AccessMode(raNative) работает и в кнопке. |
|
------- Отправлено: 10:54, 26-02-2016 | #7 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата Painkiller:
Манифест, с параметром level="requireAdministrator" + получение прав, нужны обязательно! Цитата Painkiller:
OS/Application 32bit/32bit 64bit/32bit 64bit/64bit raDefault Software Wow6432Node Software raNative Software Software Software ra32Key Software Wow6432Node Wow6432Node ra64Key Software Software Software Вы можете еще добавить в процедуры работы с привилегиями еще пару "вездесущих" привилегий: SeDebugPrivilege и SeManageVolumePrivilege. Да, после изменений в реестре нужно известить систему - SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(PChar(Ветка реестра))); |
||
------- Последний раз редактировалось opel431, 26-02-2016 в 16:50. Отправлено: 15:42, 26-02-2016 | #8 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать Цитата opel431:
Цитата opel431:
Цитата opel431:
Всё равно не работает. =( Объясните мне тогда почему мой код не используя библиотеку 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; |
|||
------- Последний раз редактировалось Painkiller, 26-02-2016 в 17:18. Отправлено: 17:04, 26-02-2016 | #9 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата Painkiller:
2. Права доступа к реестру необходимы и они присутствуют в обоих вариантах. См KEY_ALL_ACCESS у Вас и в исходнике 3. Вы работаете в системе с отключенным UAC? |
|
------- Отправлено: 17:56, 26-02-2016 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|