gpt4 book ai didi

delphi - 尝试在标准用户上写入 HKLM 时如何不触发异常?

转载 作者:行者123 更新时间:2023-12-03 15:11:48 27 4
gpt4 key购买 nike

尝试使用Delphi中的TRegistry组件将值写入HKLM注册表。

由于我以标准用户身份运行 Windows 2000(或以标准用户身份运行 XP,或以标准用户身份运行 Windows Vista,或以标准用户身份运行 Windows 7),所以我完全预计我将无法编写到注册表的 HKEY_LOCAL_MACHINE 部分:

reg := TRegistry.Create(KEY_WRITE);
try
reg.Access := KEY_WRITE; //sure, set it again, why not
reg.RootKey := HKEY_LOCAL_MACHINE;
if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
Exit;

reg.WriteString('MachineId', s);
finally
reg.Free;
end;

不幸的是,WriteString 抛出 ERegistryException:

Failed to set data for 'MachineId`

这完全是预料之中的,这就是我试图避免异常的原因。我在 TRegistry 中没有看到任何 CanWriteStringTryWriteString

尝试写入 HKLM 时如何触发异常?

<小时/>

不言而喻的注释:

  • 如果用户实际上是管理员,那么写入应该能够成功
  • 将对 WriteString 的调用包装在 try- except 中:

    reg := TRegistry.Create(KEY_WRITE);
    try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
    Exit;

    try
    reg.WriteString('MachineId', s);
    except
    on E:ERegistryException do
    {nothing};
    end;
    finally
    reg.Free;
    end;

    一开始就不会阻止异常的抛出。

更新:来自 RTL 源:

KEY_WRITE          = (STANDARD_RIGHTS_WRITE or
KEY_SET_VALUE or
KEY_CREATE_SUB_KEY) and not
SYNCHRONIZE;

来自 MSDN :

KEY_WRITE (0x20006)  

Combines the STANDARD_RIGHTS_WRITE, KEY_SET_VALUE, and KEY_CREATE_SUB_KEY access rights.

最佳答案

您无法让 TRegistry 按照您想要的方式运行。没有 TryXXX 方法,也没有禁用异常的参数。您可以确定情况确实如此,因为 TRegistry 方法不提供任何错误或状态代码。

您必须围绕 Win32 注册表 API 编写自己的包装器。

顺便说一句,我同意您在评论中表达的观点,即 TRegistry 这里缺乏功能。我们预计注册表操作会失败,因此我们不必捕获异常来处理该问题。

关于delphi - 尝试在标准用户上写入 HKLM 时如何不触发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404564/

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