4

我有两个我希望(Wix)安装我的软件的虚拟机。一个是 Windows XP SP2,另一个是 Windows XP SP1。他们都不使用域,并且他们都拥有具有管理员权限的本地用户 Administrator。

运行 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 文件。

4

1 回答 1

3

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

注册的类要么去HKEY_LOCAL_MACHINE\SOFTWARE\Classes(有时是可写的,如前所述)要么HKEY_CURRENT_USER\Software\Classes(总是可写的)。两者都有效。第一种情况是压倒性的违约。

HKEY_CLASSES_ROOT实际上只是一个视图,它合并了上述分支的内容。这就是为什么您在两个不同的位置看到它的原因。

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

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

于 2012-04-12T08:50:33.440 回答