我尝试使用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
中没有看到任何 CanWriteString
或 TryWriteString
。
尝试写入 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/