如何在没有InstallShield的情况下从OCX中“提取Com信息”?

时间:2012-03-09 17:02:38

标签: deployment com installer installshield ocx

在我们团队正在开展的其中一个项目中,我们正在尝试为现有桌面应用程序创建自动部署系统。为此,我们需要了解 InstallShield 如何安装应用程序。

我们可以访问InstallShield清单,但是有一个 OCX 文件,我们无法弄清楚如何手动安装(没有InstallShield)。此特定OCX文件设置为“提取COM信息”。

以下是截图:

InstallShield Properties Dialog

此应用程序中的其他OCX是自注册的,因此可以使用Regsvr32.exe进行注册。但是我们遇到问题的OCX无法以这种方式注册。

如何手动安装在InstallShield清单中设置为“提取COM信息”的OCX文件?

2 个答案:

答案 0 :(得分:4)

RegSvr32.exe调用LoadLibrary API来加载DLL,然后调用DLL中的DllRegisterServer入口点。该函数内的代码执行实际的COM注册。如果RegSvr32失败,这通常意味着您的DLL的依赖关系丢失或无效。

InstallShield完成所有这些以及一些非常低级别的黑客攻击,以虚拟化所有这些,然后收获它。关于这个问题的一篇旧文章是:

Spying on Registry Entries

InstallShield实际上并没有使用这种技术(他们有几种技术,其中大多数没有记录,各种过滤器和转换引擎来清理数据)。如果您只是在没有InstallShield的情况下寻找方法,那么请查看Windows Installer XML的“Heat”命令行工具。这可以将COM元数据“收集”到WxS XML元素中。

此外,WiX是开源的,所以如果你真的很好奇,你可以去查看他们的代码。

答案 1 :(得分:2)

正如Christopher所提到的,InstallShield通过查看调用时注册的内容来从.ocx中提取COM信息,类似于regsvr32.exe将调用它。它的各种形式的重定向(用于捕获目的)具有额外的好处,即在文件在构建环境中注册时解决几个潜在的权限问题。但是,如果我没有忽略您的问题的重点,那么为什么regsvr32.exe your.ocx无法在目标计算机上工作?"

这在黑暗中有点刺,因为你还没有包含足够的信息。虽然缺少依赖项可能会导致这种情况,但我猜你只会在Windows Vista / Server 2008或更高版本上看到此故障。如果是这种情况,那么您的应用程序很可能会尝试写入受Windows Resource Protection(WRP)保护的注册表项,或者被每用户类型库注册问题绊倒。< / p>

当行为不良的自注册例程遇到WRP时,它会尝试写入缺少修改权限的注册表项,然后失败整个注册。我不确定在此之前它所写的键会发生什么,但是之后的所有键肯定都没有进入机器。您应该能够使用Process Monitor等工具确认是否属于这种情况。

如果是这样的话你会怎么做?好吧,你可以坚持像InstallShield那样的提取方法(你说你想要离开)。您可以修复该文件,以免尝试写入受保护的密钥(您说无法修改)。或者您可以使用Application Compatibility Toolkit(ACT)来填充内容,但我不知道您通常如何做到下游。一般来说,我建议修复文件,或继续使用工作方法。