在现代操作系统中,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),那么现在可以读取所有完整的指令行,并且可以看到需要做什么。