2012-04-11 60 views
3

我有两台希望(Wix)安装我的软件的虚拟机。一个是Windows XP SP2,另一个是Windows XP SP1。它们都不使用域,并且它们都具有具有管理权限的本地用户管理员。为什么Regasm将ProgId放入HKEY_CURRENT_USER?

运行RegAsm.exe与SP3的机器上注册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

旧版本的设置HKEY_LOCAL_MACHINE对于普通用户是可写的,对于较新的Windows(例如Windows 7)则不可写。可能取决于配置,用户帐户类型等。

注册类可以是HKEY_LOCAL_MACHINE\SOFTWARE\Classes(有时可写,如上所述)或HKEY_CURRENT_USER\Software\Classes(始终可写)。两者都有效。第一种情况是压倒性的违约。

HKEY_CLASSES_ROOT实际上只是一个查看,它合并了上述分支的内容。这就是为什么你在两个不同的地点看到它。

RegAsm似乎足够聪明,可以检测HKLM的只读条件,并自动选择HKCU。或者你的虚拟机之间有一些不同的配置设置。

主要区别在于,在第二种情况下,该DLL只能在您注册它的用户帐户下使用。您的服务可能在另一个帐户下运行,因此无法在第二台计算机上加载该dll。

+0

谢谢。不知道什么配置问题可能会导致Regasm(或任何对HKCR的更新)写入HKCU而不是HKLM? – Bringer128 2012-04-13 00:50:22

+0

在VS2005安装项目中,有一个名为'InstallAllUsers'的设置,似乎会影响RegAsm。由于我现在没有VS,因此无法确认。就我个人而言,我更喜欢.reg文件方法,因为您可以直接控制注册表发生的变化,与Regasm/regsvr32的某些模糊操作相反。 (顺便说一句,你也可以创建一个.reg文件,删除分支,例如卸载。) – 2012-04-13 09:51:34

+0

是的,我最终修改了.reg文件,然后用heat.exe重新生成了我的Wix碎片。谢天谢地,Wix处理注册表的回滚,所以我不必担心这一点。 – Bringer128 2012-04-15 12:47:35

相关问题