为什么Regasm会将ProgId放入HKEY_CURRENT_USER?

4
我有两个虚拟机,想在上面安装我的软件(Wix)。其中一个是Windows XP SP2,另一个是Windows XP SP1。它们都没有使用域名,并且都具有具有管理员权限的本地用户管理员。
在带有SP3的机器上运行RegAsm.exe以注册MyApp.dll会将我的ProgId放入以下文件夹中:
HKEY_CLASSES_ROOT\MyAppProgId HKEY_LOCAL_MACHINE\Software\Classes\MyAppProgId
而在SP2机器上运行时,则会将其放入以下文件夹中:
HKEY_CLASSES_ROOT\MyAppProgId HKEY_CURRENT_USER\Software\Classes\MyAppProgId
我发现这一点是在尝试从服务加载MyApp.dll时发现的。从RegAsm.exe生成的注册表文件以及Heat.exe似乎都在更新HKEY_CLASSES_ROOT。
有人知道是什么原因吗?
编辑:最终通过直接写入HKEY_LOCAL_MACHINE而不是HKCR来解决了这个问题-这涉及手动编辑生成的.reg文件或.wxs文件。
1个回答

2
在旧的设置中,普通用户可以写入 HKEY_LOCAL_MACHINE ,但在新的 Windows 系统(例如 Windows 7)中则不行。这可能取决于配置、用户帐户类型等。
已注册的类别可以放在 HKEY_LOCAL_MACHINE\SOFTWARE\Classes (有时可写,如上所述)或者 HKEY_CURRENT_USER\Software\Classes (始终可写)中。两种方式都可以使用,但第一种情况是压倒性的默认选择。 HKEY_CLASSES_ROOT 实际上只是一个“视图”,它合并了前面提到的分支的内容。这就是为什么你会在两个不同的位置看到它的原因。
RegAsm 似乎足够聪明,能够检测到 HKLM 的只读条件,并自动选择 HKCU。或者存在某些配置设置,在您的虚拟机之间存在差异。
主要区别在于,第二种情况下,“dll 只能在注册它的用户帐户下使用”。您的服务可能在另一个帐户下运行,因此无法在第二台计算机上加载 dll。

谢谢。您有什么想法,是什么配置问题导致Regasm(或任何更新到HKCR)将写入HKCU而不是HKLM? - user545680
在VS2005设置项目中,有一个名为“InstallAllUsers”的设置,似乎会影响RegAsm。由于我现在手头没有VS,无法确认这一点。个人更喜欢使用.reg文件的方法,因为您可以直接控制对注册表所做的更改,而不是Regasm/regsvr32的某种模糊工作方式。(顺便说一句,您还可以创建一个删除分支的.reg文件,例如用于卸载。) - Torben Klein
是的,最终我修改了.reg文件,然后使用heat.exe重新生成了我的Wix片段。值得庆幸的是,Wix处理注册表的回滚,所以我不需要担心这个问题。 - user545680

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接