4

情况:

我在 C# 中创建了一个 DLL,它使用 COM 运行Process.Start以通过 Web 浏览器运行程序。我使用 VS2010 的内置部署项目创建了一个 MSI。我为此 DLL 中的对象指定 Guid 属性,但我从未指定位置。当我运行 MSI 并选择为“Just Me”安装时,注册表项会HKCU按预期在 (current_user) 中创建。我需要它为所有用户运行,所以当我运行 MSI 并选择为“Everyone”安装时,注册表项会在HKLM(local_machine) 中创建,也符合预期。无论哪种方式,一旦 MSI 安装了 DLL,使用 DLL 的 Intranet Web 应用程序分别对我作为管理员 (current_user) 和所有用户 (local_machine) 都可以正常工作。

然而,在我公司的主要 IT 分支内部,我们无法创建自己的 MSI。我们必须向其唯一功能是为供应商/内部开发人员创建 MSI 的人发送请求和我们的 DLL/TLB 文件。当我手动运行他的 MSI 并选择为“所有人”安装时,它再次按预期工作。

问题

但是,MSI 需要作为已部署的软件自动运行,发生这种情况时,注册表项仅在 中创建HKEY_CURRENT_USER,因此在测试用户尝试使用该功能时找不到它们。他说该ALLUSERS属性设置为 1,所以这应该可以工作。此外,当我要求他将它们安装到正确的位置(local_machine)时,他坚持说我需要在我的 DLL 中进行这些更改,因为“MSI 文件不会创建注册表项,它来自 DLL安装”。根据我在网上阅读的各种文章,MSI 通常指定注册表中创建这些键的位置。

问题(也适用于 TL;DR):

他关于我需要在我的 DLL 中指定注册表位置的说法是否属实?如果是这样,我如何以编程方式指定HKLM默认情况下要使用的这些键?现在,我所做的只是指定 ComVisible、ClassInterface、Guid、ProgId 和 ComDefaultInterface……我从未指定位置,除了 MSI 中的“Everyone/Just Me”。我对 COM 对象比较陌生,并且在注册表中弄乱了我自己的创作,所以我不想跳下他的喉咙说我不能做他应该做的事情。

谢谢!

4

2 回答 2

2

如果我正确理解您的问题,您的意思是:

  • 您不能使用自己的 MSI 在网络中部署 DLL,
  • 您无法控制 IT 部门在他们提供的 MSI 中打包和部署 DLL 的方式,
  • 您希望 IT 注册 DLL 的方式与您的完全相同。

在这种情况下,我建议创建一个合并模块 (MSM) 而不是安装包 (MSI)。将所有设置逻辑(文件、注册表项、自定义操作等)放在合并模块中。

然后围绕该合并模块编写一个简单的 MSI shell 供您自己使用,并将合并模块提供给您的 IT 部门,要求他们将其集成到自己的安装包构建过程中。

于 2012-06-19T19:28:42.110 回答
1

有一个名为“regsvr.exe”的实用程序。它在 System32 中,您应该能够在命令行上仅使用“regsvr”调用它。因此,调用是:

prompt> regsvr [dllname]

其中 [dllname] 是 DLL 文件的名称(如果它在当前目录中,则相对名称很好)。

在 windows Vista 和 7 上,该命令必须显式以管理员权限运行(即您必须以管理员权限运行 cmd.exe),仅仅作为管理员是不够的。

要以管理员权限运行命令提示符,请打开开始栏,在搜索字段中键入“cmd”,然后按 [CTRL][SHIFT][ENTER] 启动,如果出现 UAC 提示符,请接受它。(您可以通过这种方式以管理员身份运行任何程序。)

于 2012-06-19T19:28:30.797 回答