delphi – 在标准用户上尝试写入HKLM时如何不触发异常?
我试图使用Delphi中的TRegistry组件向HKLM注册表写一个值.
由于我作为标准用户(或作为标准用户的XP,或作为标准用户的Windows Vista,或带有标准用户的Windows 7)在Windows 2000上运行,我完全希望我无法写入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('SoftwareMicrosoftSQMClient',True) then Exit; reg.WriteString('MachineId',s); finally reg.Free; end; 不幸的是,WriteString抛出了一个ERegistryException: Failed to set data for 'MachineId` 这是完全可以预料到的,这就是我试图避免异常的原因.我在TRegistry中没有看到任何CanWriteString或TryWriteString. 尝试写入HKLM时如何才能触发异常? 不言而喻的笔记: >如果用户实际上是管理员,则写入应该能够成功 reg := TRegistry.Create(KEY_WRITE); try reg.RootKey := HKEY_LOCAL_MACHINE; if not reg.OpenKey('SoftwareMicrosoftSQMClient',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:
解决方法
你不能让TRegistry以你想要的方式行事.没有TryXXX方法,也没有禁用异常的参数.您可以确定这是因为TRegistry方法不提供任何错误或状态代码.
您必须围绕Win32注册表API编写自己的包装器. 顺便说一句,我同意你在评论中表达的观点,即TRegistry在这里缺乏功能.我们希望注册表操作失败,因此我们不应该捕获异常来处理它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |