delphi - 无法从注册表中读取 key

标签 delphi registry

我听说 Windows 为 PC 创建了一个唯一的 key ,称为“MachineID”。我在注册表中找到了两个位置。只有位置“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography”应该是正确的。我尝试通过此函数读取值:

    Function GetMaschineID:string;
var
Reg : TRegistry;

//HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger    =   {dd239a44-fa0d-43ff-a51c-5561d3e39de3}
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography   =   a06b0ee0-b639-4f55-9972-146776bcd5e4
begin
Reg := TRegistry.Create(KEY_READ);
try
Reg.Rootkey:=HKEY_LOCAL_MACHINE; //Hauptschlüssel
//Reg.RootKey:=HKEY_CURRENT_USER;
if Reg.OpenKey('SOFTWARE\Microsoft\Cryptography\',false) then //Unterschlüssel öffnen
//if Reg.OpenKey('Software\Microsoft\MSNMessenger\',false) then //Unterschlüssel öffnen
    begin
    Result:=Reg.ReadString('MachineGuid');
    end;
finally
     Reg.Free;
end;
end;

这个版本产生一个空字符串;您会看到注册表中的结果作为注释。 “hkey_Current_user”的第二个版本带来了预期的字符串结果。

我的代码有什么问题或注册表的某些部分是否受读保护?

最佳答案

可能的解释 1

对于 HKLM你受制于registry redirection .您有一个 32 位进程并试图从注册表的 64 位 View 中读取一个键。默认情况下,您的 32 位进程被重定向到 32 位 View ,该 View (实现细节)位于 Wow6432Node 下。 .

使用 KEY_WOW64_64KEY 从 64 位 View 读取的访问标志。详见此处:How can I read 64-bit registry key from a 32-bit process?

可能的解释 2

您调用OpenKey HKLM 下的键失败因为您正在请求写入权限,而标准用户没有对 HKLM 的写入权限.使用OpenKeyReadOnly反而。

其他建议

至少你应该多调试一下。是否调用 Reg.OpenKey成功还是失败?您应该已经调试到足以知道这一点。也许你做了但没有说。如果 Reg.OpenKey失败,那么解释 2 最有可能。即使那样,您随后也可能会遇到其他问题。

另请注意,如果调用 Reg.OpenKey,您的函数不会分配给函数结果变量,或引发错误。失败。我希望编译器会警告你。

关于delphi - 无法从注册表中读取 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812189/

相关文章:

web-services - 在 Delphi 中的 SOAP header 中发送简单字符串

delphi - TScreen->表单显示意外的额外表单

winapi - 哪些原因会导致 ShellExecute 失败?

c++ - Qt 获取注册表项

Delphi:如何显示复合组件?

delphi - 构造函数依赖注入(inject)替代方案

delphi - Delphi中Ord函数的实现

git - 如何使用带有模块的私有(private) go 包

registry - 在 Windows 客户端中通过注册表进行 Java 设置

windows - HKEY_CLASSES_ROOT\Directory\Background\shell 的问题