Delphi, объект Pascal, запись в реестр не работает - PullRequest
0 голосов
/ 25 февраля 2020

У меня проблемы с записью раздела реестра. Я использую стандартную процедуру, которую я использовал раньше, и вызываю ее в конструкторе. Я администратор на этом устройстве. По какой-то причине ключ не создается. Я работаю на виртуальной машине windows 10, но не думаю, что это что-то изменит.

unit FrmMainMenu;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, tlhelp32, ShellApi,
 Vcl.ExtCtrls, Vcl.Menus, System.Win.Registry;
type
 TMainMenu = class(TForm)
 constructor TMainMenu; overload;
 procedure RunOnWinStart(RunOnce: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MainMenu: TMainMenu;
 lclCurrProc: TProcessEntry32;
 lclPrntProc: TProcessEntry32;
 lclSnapHndl: THandle;
 lclEXEName: string;
 lclPrntName: string;
 myFileName: string;
 myFilePath: string;
 FullPath: string;
 Reg: TRegistry;

implementation

{$R *.dfm}

{ ------------------------------------------------------------------------------ }
/// <summary>
/// RunOnWinStart
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="RunOnce"></param>
/// <returns>None</returns>
procedure TMainMenu.RunOnWinStart(RunOnce: Boolean);
var
 TheKey: string;
begin
 myFileName := ExtractFileName(Application.ExeName);
 myFilePath := ExtractFilePath(Application.ExeName);
 try
   Reg := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   TheKey := 'Software\Microsoft\Windows\CurrentVersion\Run';
   if RunOnce then
     TheKey := TheKey + 'Once';
   Reg.OpenKey(TheKey, True);
   Reg.WriteString(myFileName, FullPath);
 finally
   Reg.CloseKey;
   Reg.Free;
 end;
end;

{------------------------------------------------------------------------------}
/// <summary>
/// TMainMenu
/// </summary>
/// <remarks>
/// </remarks>
/// <returns>None</returns>
constructor TMainMenu.TMainMenu;
begin
 TrayIcon1.Visible := True;
 Application.ShowMainForm := False;
 RunOnWinStart(False);
end;

1 Ответ

1 голос
/ 02 марта 2020

Если вы хотите получить доступ ко всем частям реестра, обязательно откройте ваш проект с помощью Запуск от имени администратора.

В противном случае вы можете получить доступ только к HKEY_LOCAL_MACHINE и иметь доступ только для чтения.

Вот код, который я использую (для чтения ключа, для записи нужно открыть проект от имени администратора):

 function  Getreg:string;
 var
    Reg: TRegistry;
 begin 
   try
   reg:= TRegistry.Create(KEY_READ);
   with  reg do
   begin
     try
       RootKey := HKEY_LOCAL_MACHINE ;
       if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false) then
       begin
         result:=readString('Once');
       end;
     finally
       CloseKey;
       free;
     end;
   end;
   finally

   end;
 end
...