4

以下のコードを使用して、レジストリの HKEY_LOCAL_MACHINE セクションに値を設定しようとしましたが、「... のデータを設定できませんでした」というエラーが表示されます。HKEY_CURRENT_USER を使用する場合、問題はありません。

ここで何が欠けているのでしょうか。

(コードは完全ではありませんが、重要な部分だと思います)

type
  TTypWinBits = (Bit32, Bit64);

function WinBits: TTypWinBits;
type
  TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
  hKernel32 : Integer;
  IsWow64Process : TIsWow64Process;
  IsWow64 : BOOL;
begin
  Result := Bit32;
  hKernel32 := LoadLibrary('kernel32.dll');
  if (hKernel32 = 0) then RaiseLastOSError;
  @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
  if Assigned(IsWow64Process) then
    begin
      IsWow64 := False;
      if (IsWow64Process(GetCurrentProcess, IsWow64)) then
        Result := Bit64
      else
        RaiseLastOSError;
    end;
  FreeLibrary(hKernel32);
end;

function TFastRegistry.CreateConnection: TRegistry;
begin
  Result := TRegistry.Create;
  try
    case WinBits of
      Bit32: Result := TRegistry.Create;
      Bit64: Result := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
    end;
  except
    on E: exception do
      Result := nil;
  end;
end;

procedure TFastRegistry.RunAdd(aDesc, aName: string);
var
  Reg: TRegistry;
  sRegKey: String;
begin
  sRegKey := 'Software\Microsoft\Windows\CurrentVersion\Run';
  Reg := CreateConnection;
  with Reg do
    begin
      try
        RootKey := HKEY_LOCAL_MACHINE;
        if not KeyExists(sRegKey) then
          OpenKey(sRegKey, True)
        else
          OpenKey(sRegKey, False);
        WriteString(aDesc, aName);
      finally
        CloseKey;
        Free;
      end;
    end;
end;
4

2 に答える 2

6

プログラムがローカル マシン キーに書き込むには、昇格された特権が必要です。あなたが観察したように、それがなければ、関数は失敗します。プログラムが管理ツールであると想定されている場合は、マニフェスト ファイルを使用して、OS が許可を求めるプロンプトを表示するようにします。それが必要ない場合は、代わりに現在のユーザー キーに書き込み、システム上のすべてのアカウントに影響を与えないようにします。

于 2012-07-28T13:58:53.607 に答える
0

「Free」でハンドルを解放し、レジスターの次のエントリでハンドルを再作成する必要があるだけであり、OpenKey と CloseKey を使用してハンドルを永続的にセットアップして開いたり閉じたりする必要はありません。バグのようです:-)

于 2013-10-20T17:22:07.387 に答える