gpt4 book ai didi

delphi - 为什么我不能使用 TRegistry 和 Delphi 在 Windows 注册表中创建 RunOnce 条目?

转载 作者:行者123 更新时间:2023-12-03 15:41:13 26 4
gpt4 key购买 nike

我正在使用以下代码尝试创建 RunOnce 条目:

program RunOnceTest;

{$APPTYPE CONSOLE}

uses
SysUtils, Registry, Windows;

var
R: TRegistry;
begin
try
WriteLn('Testing RunOnStartup.......');


R := TRegistry.Create;
try
R.RootKey := HKEY_LOCAL_MACHINE;
R.LazyWrite := False;
R.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True) ;
R.WriteString('this', 'that') ;
R.CloseKey;
finally
R.free;
end;

WriteLn('Test Finished');

Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

我运行该应用程序,它就会执行。

但是,没有条目:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

在我的注册表中。我需要管理员权限吗?我还需要做什么?

添加:我应该更好地解释并真正提出一个关于我想要做什么的问题。我试图让我的应用程序在启动时自动运行。许多应用程序都不需要管理员权限即可执行此操作。执行此操作的正常方法是什么?

最佳答案

首先,您需要拥有管理员权限才能在那里写入。大多数情况下,只是安装程序写入此 key ,并且它们通常运行提升。如果您想要这样做,请将其添加到您的应用程序 list 中:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>

如果对 HKLM 的写入是由不需要提升的应用程序进行的,那么请考虑将对 HKLM 的写入分离到一个单独的进程中,以便只有注册表项写入需要提升。这是 UAC 的最佳实践。

另一件可能让您烦恼的事情是您的 Delphi 应用程序将是 32 位的,因此会受到注册表重定向的影响。 HKLM\Software 的访问将被重定向到 HKLM\Software\Wow6432Node

在 64 位系统上,我认为您应该尽力写入 HKLM\Software,因此您需要禁用重定向。通过包含 KEY_WOW64_64KEY 来做到这一点在 TRegistry 实例的 Access 属性中。

Windows 在处理 RunRunOnce 键时将合并注册表的两个 View ,但如果您写入注册表的 64 位区域,您的应用程序将留下更清晰的痕迹对于这个特定的键。

关于delphi - 为什么我不能使用 TRegistry 和 Delphi 在 Windows 注册表中创建 RunOnce 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com