操作系统注册表的跨平台兼容性解决方案

在现代操作系统中,32位64位应用程序对注册表的访问方式存在差异。微软为了使操作系统能够同时运行32位和64位应用程序,不得不寻找一种统一注册表的方法,以便在透明的基础上为两者服务。由于这种情况从未被预见,微软采取了典型的事后补救措施,通过临时拼凑的方法使其工作。尽管这种方法在本质上相当混乱,但在给定的条件下,它的表现相当出色。然而,将32位和64位版本的注册表调整导入到系统中却存在问题。

一个朋友在尝试使用WPI调用Regedit.exe添加注册表调整时,发现在64位环境中并不像在32位环境中那样按预期工作,这让他感到非常沮丧。由于他不熟悉这些操作,他请帮忙查看。问题在于WPI是一个32位应用程序,所以在64位环境中,注册表项并没有写入到注册表根键HKEY_LOCAL_MACHINE,而其他所有键都写入了。这是合理的,因为WPI调用的是32位的cmd.exe来执行Regedit.exe,只有通用键被写入。

由于他希望继续使用32位的WPI,提出了以下解决方案。基本原理是编写一个编译为64位的Regedit 'Light'来执行注册表写入。代码是用Delphi编写的,因为只有一个Delphi 64位交叉编译器。由于是一个从未接触过Delphi的C程序员,是通过一个Delphi初学者网站编写这个程序的,所以从Delphi代码的角度来看,它可能不是最好的。但它确实有效。以下是代码片段:

if Pos('[', Temp) > 0 then begin Rootkeyflag := true; Delim := Pos(']', Temp); Slash := Pos('\', Temp); Rootkey := MidStr(Temp, 2, slash - 2); if Rootkey = 'HKEY_LOCAL_MACHINE' then OurReg.RootKey := HKEY_LOCAL_MACHINE; if Rootkey = 'HKEY_CURRENT_USER' then OurReg.RootKey := HKEY_CURRENT_USER; if Rootkey = 'HKEY_CLASSES_ROOT' then OurReg.RootKey := HKEY_CLASSES_ROOT; if Rootkey = 'HKEY_CURRENT_CONFIG' then OurReg.RootKey := HKEY_CURRENT_CONFIG; if Rootkey = 'HKEY_USERS' then OurReg.RootKey := HKEY_USERS; Subkey := MidStr(Temp, slash + 1, Length(Temp)); Subkey := LeftStr(Subkey, Length(Subkey) - 1); if Pos('-', Rootkey) > 0 then begin Rootkey := RightStr(Rootkey, Length(Rootkey) - 1); Deleteflag := true; end else begin Deleteflag := false; end; end;

如果(Rootkeyflag)并且(不是Addvalueflag),那么现在可以读取所有完整的指令行,并且可以看到需要做什么。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485